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