Эквивалентность Юникода
Эта статья нуждается в дополнительных цитатах для проверки . ( ноябрь 2014 г. ) |
Эквивалентность Юникода — это спецификация Юникода стандарта кодировки символов , согласно которой некоторые последовательности кодовых точек представляют по существу один и тот же символ. Эта функция была введена в стандарт для обеспечения совместимости с ранее существовавшими стандартными наборами символов , которые часто включали похожие или идентичные символы.
Unicode предоставляет два таких понятия: каноническую эквивалентность и совместимость. Предполагается, что последовательности кодовых точек , определенные как канонически эквивалентные, имеют одинаковый внешний вид и значение при печати или отображении. Например, кодовая точка U + 006E n ЛАТИНСКАЯ СТРОЧНАЯ БУКВА N, за которой следует U + 0303 ◌̃ КОМБИНАЦИЯ ТИЛЬДЫ определяется Unicode как канонически эквивалентный одной кодовой точке. U+00F1 – ЛАТИНСКАЯ СТРОЧНАЯ БУКВА N С ТИЛЬДОЙ испанского алфавита ). Следовательно, эти последовательности должны отображаться одинаковым образом, должны одинаково обрабатываться такими приложениями, как алфавитный порядок имен или поиск , и могут заменять друг друга. Аналогичным образом, каждый блок слогов хангыля , который закодирован как один символ, может быть эквивалентно закодирован как комбинация начального соединительного джамо, гласной, соединяющей джамо, и, если применимо, конечного соединительного джамо.
последовательности, определенные как совместимые, Предполагается, что могут иметь различный внешний вид, но одно и то же значение в некоторых контекстах. Так, например, кодовая точка U+FB00 ( типографская лигатура «ff») определяется как совместимая, но не канонически эквивалентная, с последовательностью U+0066 U+0066 (две латинские буквы «f»). Совместимые последовательности могут обрабатываться одинаково в некоторых приложениях (например, сортировка и индексирование ), но не в других; и могут заменять друг друга в одних ситуациях, но не в других. Последовательности, которые канонически эквивалентны, также совместимы, но обратное не обязательно верно.
Стандарт также определяет процедуру нормализации текста , называемую нормализацией Unicode , которая заменяет эквивалентные последовательности символов, так что любые два текста, которые эквивалентны, будут сведены к одной и той же последовательности кодовых точек, называемой формой нормализации или нормальной формой исходного текста. Для каждого из двух понятий эквивалентности Unicode определяет две нормальные формы: одну полностью составленную (где несколько кодовых точек заменяются отдельными точками, когда это возможно), и одну полностью декомпозированную (где отдельные точки разбиваются на несколько).
Источники эквивалентности [ править ]
Дублирование персонажей [ править ]
Для совместимости или по другим причинам Unicode иногда назначает две разные кодовые точки объектам, которые по сути являются одним и тем же символом. Например, символ «Å» может быть закодирован как U+00C5 (стандартное название «ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА A С КОЛЬЦОМ НАВЕРХУ», буква алфавита на шведском и некоторых других языках ) или как U+212B («ЗНАК АНГСТРОМА»). ). Тем не менее, символ ангстрема определяется как шведская буква, а большинство других символов, которые являются буквами (например, «V» для вольта ), не имеют отдельной кодовой точки для каждого использования. В общем, кодовые точки действительно идентичных символов (которые могут отображаться одинаковым образом в шрифтах Unicode) определяются как канонически эквивалентные.
Объединение и заранее составленные символы [ править ]
Для совместимости с некоторыми старыми стандартами Unicode предоставляет отдельные кодовые точки для многих символов, которые можно рассматривать как модифицированные формы других символов (например, U+00F1 для «ñ» или U+00C5 для «Å») или как комбинации двух или больше символов (например, U+FB00 для лигатуры «ff» или U+0132 для голландской буквы « IJ »)
Для обеспечения совместимости с другими стандартами и большей гибкости Unicode также предоставляет коды для многих элементов, которые не используются сами по себе, а предназначены для изменения или объединения с предыдущим базовым символом . Примерами таких комбинированных символов являются тильда и японский диакритический знак дакутен («◌゛», U+3099).
В контексте Юникода композиция символов — это процесс замены кодовых точек базовой буквы с последующим объединением одного или нескольких символов в один предварительно составленный символ ; а разложение характера — противоположный процесс.
В общем, предварительно составленные символы определяются как канонически эквивалентные последовательности их основной буквы и последующего сочетания диакритических знаков, в каком бы порядке они ни встречались.
Пример [ править ]
NFC-персонаж | А | м | и | л | я | и | |
---|---|---|---|---|---|---|---|
Кодовая точка NFC | 0041 | 006d | 00e9 | 006c | 0069 | 0065 | |
Кодовая точка NFD | 0041 | 006d | 0065 | 0301 | 006c | 0069 | 0065 |
NFD-персонаж | А | м | и | ◌́ | л | я | и |
Типографское невзаимодействие [ править ]
В некоторых сценариях регулярно используются несколько знаков объединения, которые, как правило, не взаимодействуют типографически и не имеют заранее составленных символов для комбинаций. Пары таких невзаимодействующих меток могут храниться в любом порядке. Эти альтернативные последовательности, как правило, канонически эквивалентны. Правила, определяющие их последовательность в канонической форме, также определяют, считаются ли они взаимодействующими.
Типографские соглашения [ править ]
Юникод предоставляет кодовые точки для некоторых символов или групп символов, которые изменяются только по эстетическим соображениям (например, лигатуры , символы катаканы половинной ширины или латинские буквы полной ширины для использования в японских текстах) или для добавления новой семантики без потеря исходного (например, цифр в нижнем или верхнем индексе или цифр в кружочках (например, «①»), унаследованных от некоторых японских шрифтов). Такая последовательность считается совместимой с последовательностью исходных (отдельных и неизмененных) символов в интересах приложений, где внешний вид и добавленная семантика не имеют значения. Однако эти две последовательности не объявлены канонически эквивалентными, поскольку различие имеет некоторую семантическую ценность и влияет на отображение текста.
Ошибки кодирования [ править ]
UTF-8 и UTF-16 (а также некоторые другие кодировки Unicode) не поддерживают все возможные последовательности кодовых единиц . Разное программное обеспечение преобразует недопустимые последовательности в символы Юникода, используя различные правила, некоторые из которых приводят к большим потерям (например, преобразование всех недопустимых последовательностей в один и тот же символ). Это можно считать формой нормализации и может привести к тем же трудностям, что и другие.
Нормализация [ править ]
Программное обеспечение для обработки текста, реализующее функции поиска и сравнения строк в Юникоде, должно учитывать наличие эквивалентных кодовых точек. В отсутствие этой функции пользователи, ищущие определенную последовательность кодовых точек, не смогут найти другие визуально неотличимые глифы, которые имеют другое, но канонически эквивалентное представление кодовых точек.
Алгоритмы [ править ]
Unicode предоставляет стандартные алгоритмы нормализации, которые создают уникальную (нормальную) последовательность кодовых точек для всех эквивалентных последовательностей; критерии эквивалентности могут быть либо каноническими (НФ), либо совместимыми (НФК). Поскольку можно произвольно выбрать представительный элемент класса эквивалентности , для каждого критерия эквивалентности возможно несколько канонических форм. Unicode предоставляет две нормальные формы, которые имеют семантическое значение для каждого из двух критериев совместимости: составные формы NFC и NFKC и разложенные формы NFD и NFKD. И составная, и разложенная формы накладывают канонический порядок на последовательность кодовых точек, который необходим для уникальности нормальных форм.
Для сравнения или поиска строк Юникода программное обеспечение может использовать как составные, так и разложенные формы; этот выбор не имеет значения, если он одинаков для всех строк, участвующих в поиске, сравнении и т. д. С другой стороны, выбор критериев эквивалентности может повлиять на результаты поиска. Например, некоторые типографские лигатуры , такие как U+FB03 ( ffi ), римские цифры , такие как U+2168 ( Ⅸ ), и даже нижние и верхние индексы , например U+2075 ( ⁵ ), имеют свои собственные кодовые точки Unicode. Каноническая нормализация (NF) не влияет ни на один из них, но нормализация совместимости (NFK) разложит лигатуру ffi на составляющие буквы, поэтому поиск U+0066 ( f ) в качестве подстроки будет успешным при нормализации NFKC U+FB03. но не в нормализации NFC U+FB03. Аналогично при поиске латинской буквы I (U+0049) в предварительно составленной римской цифре Ⅸ (U+2168). Аналогичным образом верхний индекс ⁵ (U+2075) преобразуется в 5 (U+0035) путем сопоставления совместимости.
Однако преобразование надстрочных индексов в базовые эквиваленты может оказаться неприемлемым для программного обеспечения с форматированным текстом , поскольку при этом информация надстрочных индексов теряется. Чтобы учесть это различие, база данных символов Юникода содержит теги форматирования совместимости , которые предоставляют дополнительные сведения о преобразовании совместимости. [1] В случае типографских лигатур этот тег просто <compat>
, а для верхнего индекса это <super>
. Стандарты форматированного текста, такие как HTML, учитывают теги совместимости. Например, HTML использует собственную разметку для размещения U+0035 в позиции надстрочного индекса. [2]
Нормальные формы [ править ]
Четыре формы нормализации Unicode и алгоритмы (преобразования) их получения перечислены в таблице ниже.
НФД Форма нормализации Каноническое разложение | Символы разлагаются по канонической эквивалентности, а несколько комбинируемых символов располагаются в определенном порядке. |
НФК Форма нормализации Каноническая композиция | Символы разлагаются, а затем перекомпонуются по канонической эквивалентности. |
НФКД Разложение совместимости форм нормализации | Символы разбиваются по совместимости, а несколько комбинируемых символов располагаются в определенном порядке. |
НФКЦ Состав совместимости форм нормализации | Символы разлагаются по совместимости, а затем перекомпонуются по канонической эквивалентности. |
Все эти алгоритмы являются идемпотентными преобразованиями, что означает, что строка, которая уже находится в одной из этих нормализованных форм, не будет изменена при повторной обработке тем же алгоритмом.
Нормальные формы не закрываются при конкатенации строк . [3] Для дефектных строк Юникода, начинающихся с гласной хангыля или заканчивающейся соединяющейся Jamo , конкатенация может привести к нарушению композиции.
Однако они не инъективны (они отображают разные исходные глифы и последовательности в одну и ту же нормализованную последовательность) и, следовательно, не являются биективными (не могут быть восстановлены). Например, отдельные строки Юникода «U+212B» (знак ангстрема «Å») и «U+00C5» (шведская буква «Å») расширяются с помощью NFD (или NFKD) в последовательность «U+0041». U+030A» (латинская буква «A» и объединяющее кольцо над «°»), которое затем сокращается с помощью NFC (или NFKC) до «U+00C5» (шведская буква «Å»).
Один символ (кроме блока слогов хангыль), который будет заменен другим при нормализации, может быть идентифицирован в таблицах Юникода как имеющий непустое поле совместимости, но не имеющий тега совместимости.
Канонический порядок [ править ]
Канонический порядок в основном связан с упорядочиванием последовательности комбинируемых символов. В примерах этого раздела мы предполагаем, что эти символы являются диакритическими знаками , хотя в целом некоторые диакритические знаки не являются объединяющими символами, а некоторые комбинируемые символы не являются диакритическими знаками.
Unicode присваивает каждому символу комбинационный класс , который идентифицируется числовым значением. Необъединяемые символы имеют номер класса 0, а комбинируемые символы имеют положительное значение класса объединения. Чтобы получить канонический порядок, каждая подстрока символов, имеющая ненулевое значение класса объединения, должна быть отсортирована по значению класса объединения с использованием стабильного алгоритма сортировки. Требуется стабильная сортировка, поскольку предполагается, что объединение символов с одним и тем же значением класса взаимодействует типографски, поэтому два возможных порядка не считаются эквивалентными.
Например, иероглиф U+1EBF (ế), используемый во вьетнамском языке , имеет как острый, так и циркумфлексный акцент. Его каноническое разложение представляет собой трехсимвольную последовательность U+0065 (e) U+0302 (циркумфлексный акцент) U+0301 (острый акцент). Оба класса объединения для двух акцентов равны 230, поэтому U+1EBF не эквивалентен U+0065 U+0301 U+0302.
Поскольку не все объединяющие последовательности имеют заранее составленный эквивалент (последняя в предыдущем примере может быть сокращена только до U+00E9 U+0302), даже на нормальную форму NFC влияет поведение объединенных символов.
Ошибки из-за различий в нормализации [ править ]
Когда два приложения совместно используют данные Unicode, но нормализуют их по-разному, это может привести к ошибкам и потере данных. В одном конкретном случае OS X нормализовала имена файлов в Юникоде, отправленные из программного обеспечения Samba для совместного использования файлов и принтеров. Samba не распознала измененные имена файлов как эквивалентные исходным, что привело к потере данных. [4] [5] Решение такой проблемы нетривиально, поскольку нормализация не является обратимой без потерь.
См. также [ править ]
- Сложная компоновка текста
- Диакритический знак
- Атака по омографу IDN
- ИСО/МЭК 14651
- Лигатура (типографика)
- Предварительно составленный персонаж
- Инструмент uconv может конвертировать в формы нормализации Unicode NFC и NFD и обратно.
- Юникод
- Символы совместимости с Юникодом
Примечания [ править ]
- ^ «UAX № 44: База данных символов Юникода» . Юникод.орг . Проверено 20 ноября 2014 г.
- ^ «Юникод в XML и других языках разметки» . Юникод.орг . Проверено 20 ноября 2014 г.
- ^ Пер Что следует делать с конкатенацией
- ^ «Sourceforge.net» . Sourceforge.net . Проверено 20 ноября 2014 г.
- ^ «rsync, samba, UTF8, международные символы, о боже!» . 2009. Архивировано из оригинала 9 января 2010 года.