Самый простой способ извлечь первую кодовую точку 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;