Einfachste Möglichkeit, den ersten Unicode-Codepunkt eines NSString (außerhalb des BMP) zu extrahieren?

Aus historischen Gründen handelt es sich bei der Unicode-Implementierung von Cocoa um eine 16-Bit-Implementierung: Sie verarbeitet die oben genannten Unicode-Zeichen0xFFFF über "Ersatzpaare". Dies bedeutet, dass der folgende Code nicht funktioniert:

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

Jetzt,diese Code funktioniert 100% der Zeit, aber es ist lächerlich wortreich:

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"

Unddiese Code mitmbtowc funktioniert, ist aber immer noch ziemlich ausführlich, beeinflusst den globalen Status, ist nicht threadsicher und füllt wahrscheinlich den Autorelease-Pool auf:

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

Gibt es irgendwelcheeinfach Cocoa / Foundation-Idiom zum Extrahieren des ersten (oder N-ten) Unicode-Codepunkts aus einem NSString? Bevorzugen Sie einen Einzeiler, der nur den Codepunkt zurückgibt?

Die Antwort inDiese ansonsten hervorragende Zusammenfassung der Cocoa Unicode-Unterstützung (am Ende des Artikels) lautet einfach: "Probieren Sie es nicht aus. Wenn Ihre Eingabe Ersatzpaare enthält, filtern Sie sie heraus oder so, da es keinen vernünftigen Weg gibt, mit ihnen richtig umzugehen."

Antworten auf die Frage(1)

Ihre Antwort auf die Frage