Objective-C Как получить Unicode символов - PullRequest
4 голосов
/ 18 января 2011

Я хочу получить кодовую точку Unicode для данного символа Unicode в Objective-C.NSString сказал, что он внутренне использует кодировку UTF-16, и сказал:

Класс NSString имеет два примитивных метода - length и characterAtIndex: - которые обеспечивают основу для всех других методов в его интерфейсе.Метод length возвращает общее количество символов Unicode в строке.characterAtIndex: предоставляет доступ к каждому символу в строке по индексу со значениями индекса, начинающимися с 0.

Кажется, предполагается, что метод characterAtIndex поддерживает Unicode.Однако возвращается unichar типа int без знака в 16 бит.

- (unichar)characterAtIndex:(NSUInteger)index

Вопросы:

  • Q1: как представить кодовую точку Unicode выше UFFFF?

  • Q2: Если Q1 имеет смысл, есть ли способ получить кодовую точку Unicode для данного символа Unicode в Objective-C.

Thx.

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Короткий ответ на вопрос "Q1: как он представляет кодовую точку Unicode над UFFFF?"Это: Вы должны быть UTF16 осведомлены и правильно обрабатывать Суррогатные кодовые точки .Информация и ссылки ниже должны дать вам указатели и пример кода, который позволяет вам сделать это.

Документация NSString верна.Однако, в то время как вы сказали «NSString сказал, что использует внутреннее кодирование UTF-16», точнее будет сказать, что открытый / абстрактный интерфейс для NSString основан на UTF16.Разница в том, что это оставляет внутреннее представление строки частной реализацией, но открытые методы, такие как characterAtIndex: и length, всегда находятся в UTF16.

Причина этого в том, что она имеет тенденциюдля достижения наилучшего баланса между старыми ASCII -центрическими и Unicode-ориентированными строками, в значительной степени из-за того, что Unicode является строгим надмножеством ASCII (ASCII использует 7 битов для 128 символов, которые отображаются на первый128 кодовых точек Unicode).

Для представления Unicode кодовых точек , которые> U+FFFF, что, очевидно, превышает то, что может быть представлено в одной UTF16 кодовой единице , UTF16 использует специальные суррогатные кодовые точки для формирования суррогатной пары , которые при объединении образуют кодовую точку Unicode> U+FFFF.Вы можете найти подробности об этом по адресу:

2 голосов
/ 18 января 2011

Из документации length:

Возвращенное число включает в себя отдельные персонажи состоят последовательности символов, поэтому вы не можете использовать этот метод, чтобы определить, является ли строка будет видно при печати или как долго он появится.

Из этого я бы заключил, что любые символы выше U + FFFF будут считаться двумя символами и будут кодироваться как суррогатная пара (см. Соответствующую запись в http://unicode.org/glossary/).

Если у вас есть строка в кодировке UTF-32 с символом, который вы хотите преобразовать, вы можете создать новую строку NSString с initWithBytesNoCopy:length:encoding:freeWhenDone: и использовать ее результат, чтобы определить, как символ кодируется в UTF-16, но если вы будете выполнять очень сложную обработку Unicode, лучше всего, вероятно, познакомиться с ICU (http://site.icu -project.org /).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...