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

но также не все языковые символы являются единственными кодовыми точками. т.е. не все языковые символы представлены одним или двумя модулями UTF-16. Многие символы представлены последовательностью кодовых точек Unicode.

Это означает, что, если вы не имеете дело с Ascii, вы должны рассматривать языковые символы как подстроки, а не юникод-кодовые указатели на индексы.

Чтобы получить подстроку для символа с индексом 0:

NSRange r = [[myString rangeOfComposedCharacterSequenceAtIndex:0];
[myString substringWithRange:r];

Это может или не может быть то, что вы хотите, в зависимости от того, что вы на самом деле надеетесь сделать. например хотя это даст вамграницы персонажей эти победилиt соответствуют точкам вставки курсора, которые зависят от языка.

 Quuxplusone09 окт. 2012 г., 01:57
Добавлю, и я вижу свое применениеперсонаж" было проблематично выше. Я'я знаю, чтоé может состоять из двух кодовых точек´ а такжеe, например. Для моих целей этоКак-то неясно, насколько хороша будет одна кодовая точка, но ради определимости яищу что-то, что работает как Сmbtowc для NSStrings, что означает кодовые точки. Я'поменяю "первый персонаж к "первая кодовая точка " во всем, чтобы избежать двусмысленности.
 uliwitness01 мая 2018 г., 14:40
Выражаем это, потому что это, вероятно, то, что большинство людей действительно хотят, когда они задают этот вопрос, и Google отправляет их сюда, хотя это не является строго ответом на то, что хотел ОП.

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