Символы и кластеры графемы
Распространено думать о строке как о последовательности символов, но при работе с NSString
объекты, или с Unicode представляет в виде строки в целом, в большинстве случаев лучше иметь дело с подстроками, а не с отдельными символами. Причина этого состоит в том, что то, что пользователь чувствует как символ в тексте, может во многих случаях быть представлено многократными символами в строке. NSString
имеет большие материально-технические ресурсы методов для того, чтобы должным образом обработать строки Unicode, в целом делающие соответствие Unicode простым, но существует несколько мер предосторожности, которые необходимо наблюдать.
NSString
объектами является концептуально UTF-16 с порядком байтов платформы. Это не обязательно подразумевает что-либо об их механизме внутренней памяти; то, что это означает, является этим NSString
длины, индексы символа и диапазоны выражены с точки зрения модулей UTF-16, и что термин «символ» в NSString
имена методов отсылают к 16-разрядному порядку байтов платформы модули UTF-16. Это - общее соглашение для строковых объектов. В большинстве случаев клиенты не должны быть чрезмерно обеспокоены этим; пока Вы имеете дело с подстроками, точная интерпретация индексов диапазона является не обязательно значительной.
Подавляющее большинство кодовых точек Unicode, используемых для записи живых языков, представлено единственными модулями UTF-16. Однако некоторые менее общие кодовые точки Unicode представлены в UTF-16 суррогатными парами. Суррогатная пара является последовательностью двух модулей UTF-16, взятых от определенных зарезервированных диапазонов, вместе представляющих единственную кодовую точку Unicode. CFString имеет функции для преобразования между суррогатными парами и представлением UTF-32 соответствующей кодовой точки Unicode. При контакте с NSString
объекты, одно ограничение состоит в том, что границы подстроки обычно не должны разделять две половины суррогатной пары. Это обычно автоматически для диапазонов, возвращенных из большинства методов Какао, но если Вы создаете диапазоны подстроки сами, необходимо помнить это. Однако это не единственное ограничение, которое необходимо рассмотреть.
Во многих системах письменности отдельный символ может быть составлен из основной буквы плюс диакритический знак или другое художественное оформление. Число возможных букв и диакритических знаков устраняет Unicode от представления каждой комбинации как единственная кодовая точка, таким образом, в целом такие комбинации представлены основным символом, сопровождаемым одной или более объединяющимися метками. По причинам совместимости Unicode действительно имеет единственные кодовые точки для многих наиболее распространенных комбинаций; они упоминаются как предварительно составленные формы, и трансформации нормализации Unicode могут использоваться для преобразования между предсоставленными и анализируемыми представлениями. Однако, даже если строка полностью предварительно составлена, существует все еще много комбинаций, которые должны быть представлены с помощью основного символа и комбинируя метки. Для большей части обработки текста должны быть расположены диапазоны подстроки так, чтобы их границы не разделяли основной символ от его связанных меток объединения.
Кроме того, существуют системы письменности, в которых символы представляют комбинацию частей, которые более сложны, чем метки диакритического знака. На корейском языке, например, единственный слог Хангула может быть составлен из двух или трех подразделений, известных как jamo. В Относящихся к Индии и Относящийся к Индии влиявших системах письменности, распространенных всюду по Южной и Юго-Восточной Азии, единственные записанные символы часто представляют комбинации согласных, гласных и меток, таких как viramas, и представления Unicode этих систем письменности часто используют кодовые точки для этих отдельных частей, так, чтобы отдельный символ мог быть составлен из многократных кодовых точек. Для большей части обработки текста должны также быть расположены диапазоны подстроки так, чтобы их границы не разделяли jamo в единственном слоге Хангула или компоненты Относящегося к Индии совместимого кластера.
В целом эти комбинации — суррогатные пары, основные символы плюс объединение меток, Хангул jamo и Относящиеся к Индии совместимые кластеры — упоминаются как кластеры графемы. Для принятия во внимание их можно использовать NSString
rangeOfComposedCharacterSequencesForRange:
или rangeOfComposedCharacterSequenceAtIndex:
методы, или CFStringGetRangeOfComposedCharactersAtIndex
. Они могут использоваться для корректировки индексов строк или диапазонов подстроки так, чтобы они упали на границы кластера графемы, приняв во внимание все упомянутые выше ограничения. Эти методы должны быть выбором по умолчанию для того, чтобы программно определить границы воспринятых пользователями символов.:
В некоторых случаях алгоритмы Unicode имеют дело с многократными символами способами, идущими вне даже границ кластера графемы. Алгоритмы преобразования регистра Unicode могут преобразовать отдельный символ в многократные символы при движении от нижнего регистра до верхнего регистра; например, стандартный прописной эквивалент немецкого символа «с» является последовательностью с двумя буквами «SS». Локализованные алгоритмы сопоставления на многих языках рассматривают многократные последовательности символов как единые блоки; например, последовательность «ch» обрабатывается как одна буква для сортировки целей на некоторых европейских языках. Для контакта должным образом со случаями как они, важно использовать стандарт NSString
методы для таких операций как преобразование регистра, сортировка и поиск, и использовать их на всей строке, к которой они должны применяться. Использовать NSString
методы такой как lowercaseString
, uppercaseString
, capitalizedString
, compare:
и его варианты, rangeOfString:
и его варианты, и rangeOfCharacterFromSet:
и его варианты или их эквиваленты CFString. Они все принимают во внимание сложности строковой обработки Unicode, и поиск и методы сортировки в частности имеют много опций управлять типами эквивалентностей, которые они должны распознать.
В немного меньшем количестве общих падежей может быть необходимо адаптировать определение кластеров графемы к определенной потребности. Проблемы, вовлеченные в определение и адаптацию границ кластера графемы, охвачены подробно в Приложении № 29 Стандарта Unicode, дающем много примеров и некоторые алгоритмы. Стандарт Unicode в целом является лучшим источником для получения информации об алгоритмах Unicode и соображениях, вовлеченных в обработку строк Unicode.
Если Вы интересуетесь границами кластера графемы с точки зрения перемещения курсора и расположения точки вставки, и Вы используете текстовую систему Какао, необходимо знать это на OS X v10.5 и позже, NSLayoutManager
имеет поддержку API определения позиций точки вставки в строке текста, поскольку это размечается. Обратите внимание на то, что границы точки вставки не идентичны границам глифа; глиф лигатуры в некоторых случаях, такой как «fi» лигатура в латинском сценарии, может потребовать внутренней точки вставки на воспринятой пользователями символьной границе. Посмотрите текстовое Руководство по архитектуре Какао для получения дополнительной информации.