¿La forma más sencilla de extraer el primer punto de código Unicode de una NSString (fuera de la BMP)?

Por razones históricas, la implementación de Unicode de Cocoa es de 16 bits: maneja los caracteres Unicode anteriores0xFFFF a través de "pares sustitutos". Esto significa que el siguiente código no va a funcionar:

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

Ahora,esta El código funciona el 100% del tiempo, pero es ridículamente detallado:

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"

Yesta código usandombtowc funciona, pero sigue siendo bastante detallado, afecta el estado global, no es seguro para subprocesos y, probablemente, llena el conjunto de autorelease por encima de todo eso:

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

Hay algunasencillo ¿Idioma de cacao / fundación para extraer el primer (o N) punto de código Unicode de un NSString? ¿Preferiblemente un one-liner que simplemente devuelve el punto de código?

La respuesta dada enEste excelente resumen del soporte de Cocoa Unicode. (cerca del final del artículo) es simplemente "No lo intentes. Si tu entrada contiene pares sustitutos, filtra hacia fuera o algo así, porque no hay una forma sensata de manejarlos correctamente".

Respuestas a la pregunta(1)

Su respuesta a la pregunta