Символы и кластеры.

Cocoa

Как правило, когда думают о строке то предстовляют себе последовательность символов, но при работе с NSString объектом, или с Unicode строкой в целом, в большинстве случаев лучше иметь дело с подстрокой, а не с отдельными символами. Причина этого в том, что пользователь воспринимает как символ в тексте то, что во многих случаях может быть представлено несколькими символами в строке. NSString имеет большой перечень методов для правильной обработки Unicode строк, которые в целом делают соответствие Unicode легким, но есть некоторые меры предосторожности, которые следует соблюдать.

NSString объекты концептуально UTF-16 с прямым порядком байтов. Это не говорит об их внутреннем механизме хранения, но это означает, что NSString выражается через UTF-16 единицы длины, символов, индексов и диапазонов, и что термин "символ" в названиях NSString методов относится к 16 -битной платформе с прямым порядком байт UTF-16 символов. Это общее соглашение для строковых объектов. В большинстве случаев, клиенты не должны быть слишком заинтересованные в этом, до тех пор, пока вы имеете дело с подстроками и точная интерпретация диапазона индексов не обязательно значима.

Подавляющее большинство Юникода используется для записи живых языков представленых одним UTF-16 символом. Однако некоторые менее распространенные языки представлены в кодировке UTF-16 с помощью суррогатных пар. Суррогатная пара представляет собой последовательность из двух UTF-16 символов, взятых из конкретного зарезервированного диапазона, которые в совокупности представляют собой единую точку кода Юникода. CFString имеет функции для преобразования между суррогатной парой и UTF-32 представлением соответствующей Юникоду кодовой точкой. При работе с объектами NSString, есть одно ограничение, состоящее в том, что границами подстрок, не следует разделять две половины суррогатной пары. Как правило, это решается автоматически для диапазонов возвращеемых из большинства методов Cocoa, но если вы создаете диапазоны подстрок сами, вы должны иметь это в виду. Тем не менее, это не единственное ограничение, которое Вы должны рассмотреть.

Во многих системах письменности, один символ может состоять из базового символа плюс иметь ударение или другую декорацию. Число возможных букв и их декораций исключено из Unicode, представляющего каждую комбинацию, как единую точку кода, так что в целом такие комбинации представлены базовым символом, за которым следует один или более присоединяемых знаков. Из соображений совместимости, Unicode имеет единую точку кода для ряда наиболее распространенных комбинаций, они называются precomposed forms и преобразования нормализации Unicode могут быть использованы для преобразования между precomposed и разложенным представлением. Однако, даже если строка полностью precomposed, существует много комбинаций, которые должны быть представлены с использованием базового знака и сочетанием знаков. Для большинства текстов, диапазоны подстрок должны быть устроены так, чтобы их границы не разделяли базовый символ от связанного с ним сочетания знаков.

Кроме того, есть письменности, в которых символы представляют собой комбинацию частей, которые являются более сложными, чем знак ударения. В корейском, например, отдельный слог Hangul может состоять из двух или трех подразделов известный как Jamo. В индийских и письменностях распространеных по всей Южной и Юго-Восточной Азии, один письменный знак часто представляет собой сочетания согласных, гласных и знаков, такие как viramas и Unicode представления для этих систем письменности часто используют элементы кода для этих отдельных частей, так, что один символ может состоять из нескольких точек кода. Для большинства текстов, диапазоны подстрок также должны быть устроены так, что их границы не разделяют Jamo в одном слоге Hangul или компоненты кластера согласных индийских.

В общем, это комбинация-суррогатных пар, базовый символ плюс сочетание знаков, Hangul Jamo, и индийских согласных, называются графемой кластеров. Для того, чтобы принять их во внимание, вы можете использовать методы NSString rangeOfComposedCharacterSequencesForRange: или rangeOfComposedCharacterSequenceAtIndex:, или CFStringGetRangeOfComposedCharactersAtIndex. Они могут быть использованы для корректировки индексов строки или диапазонов подстрок, так что они падают на границы графем кластера, с учетом всех ограничений, упомянутых выше. Эти методы должны быть выбораны по умолчанию для программного определения границ воспринимаемых пользователем символов.:

В некоторых случаях, алгоритмы Unicode имеют дело с несколько символами таким образом, что выходят за рамки даже графема границы кластера. В Unicode алгоритмы регистра могут преобразовать один символ в несколько символов при переходе от нижнего регистра в верхний, например, стандартный эквивалент заглавного немецкого символа "ß" является двухбуквенная последовательность "SS". Локализованные алгоритмы сортировки на многих языках рассматривают несколько символов последовательности, как отдельные единицы, например, последовательность "ch" считается одной буквой при сортировке в некоторых европейских языках. Для того, чтобы иметь дело с должным образом обработынным результатом, в подобных случаях важно использовать стандартные методы NSString для таких операций, как регистр, сортировка и поиск, и использовать их ко всей строке, к которой они должны применяться. Используйте NSString методы, такие как lowercaseString, uppercaseString, capitalizedString, compare: и их варианты, rangeOfString: и его варианты, и rangeOfCharacterFromSet: и его варианты, или их эквивалентов CFString. Все это учитывает сложность обработки Unicode строк, и поиск и сортировка методами, в частности, есть много вариантов для контроля типов эквивалентности их распознования.

В некоторых менее распространенных случаях может возникнуть необходимость адаптировать определение графема кластеры особой необходимости.Вопросы, связанные с определением границ и пошив одежды графема кластера подробно описан в стандарте Unicode Приложение № 29, где дается ряд примеров и некоторых алгоритмов. Стандарт Unicode в целом является лучшим источником информации о Unicode алгоритмах и соображениях, связанных с обработкой Unicode строк.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac