Самый простой способ извлечь первую кодовую точку Unicode NSString (за пределами BMP)?

По историческим причинам реализация Unicode в Какао является 16-битной: она обрабатывает символы Unicode выше0xFFFF через "суррогатные пары". Это означает, что следующий код не будет работать:

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

Сейчас,this код работает 100% времени, но это смешно многословно:

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"

А такжеthis код с использованиемmbtowc работает, но все еще довольно многословно, влияет на глобальное состояние, не является поточно-ориентированным и, вероятно, заполняет пул авто-релиза поверх всего этого:

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

Есть лиsimple Какао / фундаментальная идиома для извлечения первой (или N-й) кодовой точки Unicode из строки NSString? Предпочтительно однострочник, который просто возвращает код?

Ответ дан вв остальном это отличная сводка поддержки Какао Unicode (ближе к концу статьи) просто «не пытайтесь». Если ваши входные данные содержат суррогатные пары, отфильтруйте их или что-то в этом роде, потому что нет нормального способа правильно их обработать. & Quot;

Ответы на вопрос(1)

Ваш ответ на вопрос