Самый простой способ извлечь первую кодовую точку 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 (ближе к концу статьи) простоДон»попробуй это. Если ваш вход содержит суррогатные пары, отфильтруйте их или что-то, потому что тамнет нормального способа обращаться с ними должным образом. "