Maneira mais simples de extrair o primeiro ponto de código Unicode de um NSString (fora do BMP)?

Por motivos históricos, a implementação Unicode do Cocoa é de 16 bits: ele manipula os caracteres Unicode acima0xFFFF via "pares substitutos". Isso significa que o código a seguir não irá funcionar:

NSString myString = @"";
uint32_t codepoint = [myString characterAtIndex:0];
printf("%04x\n", codepoint);  // incorrectly prints "d842"

Agora,isto código funciona 100% do tempo, mas é ridiculamente detalhado:

NSString myString = @"";
uint32_t codepoint;
[@"" getBytes:&codepoint maxLength:4 usedLength:nil
    encoding:NSUTF32StringEncoding options:0
    range:NSMakeRange(0,2) remainingRange:nil];
printf("%04x\n", codepoint);  // prints "20d20"

Eisto código usandombtowc funciona, mas ainda é bem detalhado, afeta o estado global, não é thread-safe e provavelmente preenche o pool de autorelease em cima de tudo isso:

setlocale(LC_CTYPE, "UTF-8");
wchar_t codepoint;
mbtowc(&codepoint, [@"" UTF8String], 16);
printf("%04x\n", codepoint);  // prints "20d20"

Existe algumsimples Idioma Cocoa / Foundation para extrair o primeiro (ou Nth) ponto de código Unicode de um NSString? De preferência, um one-liner que apenas retorna o codepoint?

A resposta dada emeste excelente resumo do suporte do Cocoa Unicode (perto do final do artigo) é simplesmente "Não tente. Se a sua entrada contém pares substitutos, filtre-os ou algo assim, porque não há uma maneira sã de lidar com eles adequadamente."

questionAnswers(1)

yourAnswerToTheQuestion