[php] Что такое нормализованный UTF-8?


Answers

Некоторые символы, например буква с акцентом (скажем, é ), могут быть представлены двумя способами: одной кодовой точкой U+00E9 или простой буквой, за которой следует комбинационный знак акцента U+0065 U+0301 . Обычная нормализация выберет один из них, чтобы всегда представлять его (единая кодовая точка для NFC, комбинирующая форма для NFD).

Для символов, которые могут быть представлены несколькими последовательностями базовых символов и комбинацией меток (например, «s», «точка внизу», «точка выше»), вместо того, чтобы поставить точку выше точки ниже или использовать базовый символ, который уже имеет одну из точек), NFD будет также выберите один из них (ниже идет сначала, как это бывает)

Разделения совместимости включают в себя несколько символов, которые «на самом деле не должны» быть символами, но потому, что они использовались в устаревших кодировках. Обычная нормализация не будет унифицировать их (чтобы сохранить целостность «туда и обратно» - это не проблема для объединения форм, потому что не использовалось кодирование с устаревшим [кроме нескольких вьетнамских кодировок]), но нормализация совместимости будет. Подумайте, как «килограммовый» килограммовый знак, который появляется в некоторых восточноазиатских кодировках (или полуширине / полной ширине катаканы и алфавита), или «fi» лигатура в MacRoman.

Дополнительную информацию см. На странице http://unicode.org/reports/tr15/ .

Question

В проекте ICU (который теперь также есть библиотека PHP ) содержатся классы, необходимые для нормализации строк UTF-8, чтобы упростить сравнение значений при поиске.

Тем не менее, я пытаюсь понять, что это означает для приложений. Например, в каких случаях я хочу «Каноническая эквивалентность» вместо «эквивалентности совместимости» или наоборот?




Это на самом деле довольно просто. UTF-8 фактически имеет несколько разных представлений одного и того же «символа». (Я использую символ в кавычках, так как по-разному они разные, но практически одинаковы). Пример приведен в связанном документе.

Символ «Ç» может быть представлен как последовательность байтов 0xc387. Но он также может быть представлен C (0x43), за которым следует последовательность байтов 0x8ccca7. Таким образом, вы можете сказать, что 0xc387 и 0x438ccca7 являются одинаковыми символами. Причина, по которой это работает, заключается в том, что 0x8ccca7 является комбинированной меткой; то есть он принимает характер перед ним (здесь C ) и изменяет его.

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

Есть два типа символов, которые передают смысл через значение , и те, которые принимают другого персонажа и меняют его. Итак, 9 - значащий персонаж. Супер-скрипт ⁹ принимает это значение и изменяет его путем представления. Таким образом, канонически они имеют разные значения, но они все еще представляют базовый характер.

Таким образом, каноническая эквивалентность - это то, где последовательность байтов передает один и тот же символ с тем же значением. Эквивалентность совместимости - это когда последовательность байтов создает другой символ с тем же базовым значением (даже если он может быть изменен). Таким образом, 9 и ⁹ эквивалентны совместимости, поскольку оба они означают «9», но не являются канонически эквивалентными, поскольку они не имеют одинакового представления ...

Надеюсь, это поможет...




Если две строки в Юникоде канонически эквивалентны, строки действительно одинаковы, только с использованием разных последовательностей юникода. Например, Ä можно представить либо с использованием символа Ä, либо из комбинации A и ◌̈.

Если строки эквивалентны только эквивалентности, строки не обязательно одинаковы, но они могут быть одинаковыми в некоторых контекстах. Например, ff можно считать тем же, что и ff.

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

Но если вы хотите отсортировать набор строк, имеет смысл использовать эквивалентность совместимости, так как они почти идентичны.




Links