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

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

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

Сейчас,этот код работает 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"

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

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

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

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

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

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