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."