Najprostszy sposób na wyodrębnienie pierwszego punktu kodowego Unicode NSString (poza BMP)?

Ze względów historycznych implementacja Unicode Cocoa jest 16-bitowa: obsługuje znaki Unicode powyżej0xFFFF przez „pary zastępcze”. Oznacza to, że następujący kod nie zadziała:

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

Teraz,to kod działa w 100% przypadków, ale jest śmiesznie gadatliwy:

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"

Ito kod za pomocąmbtowc działa, ale nadal jest dość gadatliwy, wpływa na stan globalny, nie jest bezpieczny dla wątków i prawdopodobnie wypełnia pulę autorelease na dodatek do tego wszystkiego:

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

Czy jest jakiśprosty Cocoa / Foundation idiom do wyodrębnienia pierwszego (lub N-tego) punktu kodowego Unicode z NSString? Najlepiej jeden liner, który po prostu zwraca punkt kodowy?

Odpowiedź udzielona wto doskonałe podsumowanie obsługi Cocoa Unicode (pod koniec artykułu) jest po prostu „Nie próbuj tego. Jeśli twoje dane wejściowe zawierają pary zastępcze, odfiltruj je lub coś, bo nie ma rozsądnego sposobu na ich właściwe traktowanie”.

questionAnswers(1)

yourAnswerToTheQuestion