Нормализация, выравнивание регистра и подготовка строк
Нормализация Unicode помогает определить, являются ли две строки Unicode
одинаковыми, и предоставляет стандартные формы, которые можно использовать для
обработки и хранения строк. Некоторые символы могут быть представлены в Unicode
несколькими кодовыми последовательностями. Это называется эквивалентностью
Unicode.
В Unicode предусмотрено два вида эквивалентности:
- Каноническая
- Совместимая
Последовательности, представляющие один и тот же визуальный символ, называются
канонически эквивалентными. Эти последовательности имеют одинаковый внешний
вид и значение при печати или отображении.
Например:
U+006E (латинская строчная буква «n»), за которой следует U+0303 (комбинируемая тильда «◌̃») | = ñ |
U+00F1 (строчная буква «ñ» испанского алфавита) | = ñ |
Unicode определяет NFC (форму нормализации C) как каноническую декомпозицию, за
которой следует каноническая композиция. Это сокращает текст до минимального
количества символов, не изменяя его внешний вид. Следует отметить, что в этом
примере все три символа выше разрешено использовать в соответствии с IDNA2008.
Совместимыми эквивалентами являются последовательности, которые могут
выглядеть по-разному, но в некоторых ситуациях имеют одинаковое значение. Это
более слабый вид эквивалентности символов или их последовательностей.
Например:
U+FB00 (типографская лигатура «ff») | = ff |
U+0066 U+0066 (две латинские буквы «f») | = ff |
В приведенном выше примере символ U+FB00 определена как совместимая, но
не канонически эквивалентная последовательности U+0066 U+0066. Канонически
эквивалентные последовательности также совместимы, но обратное не всегда верно.
Следует отметить, что в соответствии с IDNA2008 символ U+FB00 не
разрешено использовать.
Unicode определяет NFKC (форму нормализации KC) как совместимую
декомпозицию, за которой следует каноническая композиция. Это сокращает текст до
стандартного набора символов и может изменить его внешний вид. Например,
NKFC превращает лигатуру «ff» в две буквы «ff», а символ времени до полудня
(U+33C2) в четыре символа «a.m.» (U+0061 U+002E U+006D U+002E).
Чтобы избежать проблем с функциональной совместимостью, возникающих из-за
использования канонически эквивалентных, но разных символьных
последовательностей, W3C рекомендует использовать для всего текста NFC.
Полный список символов, которые могут измениться при любой из форм
нормализации см. здесь.
Следует отметить еще несколько моментов:
- Символы в метках IDN-доменов должны иметь нормализацию по форме NFC.
- Когда два приложения совместно используют данные Unicode, но по-разному их нормализуют, могут возникнуть ошибки и потеря данных.
- Консорциум Unicode убежден, что существующие формы нормализации не должны меняться со временем в целях обеспечения обратной совместимости приложений, которые их используют.
- Как уже отмечалось, используйте консервативный подход, рассматривая вопрос о том, какие символы разрешить в доменном имени.
Советы разработчикам программного обеспечения
- Не пытайтесь нормализовать путем преобразования в верхний регистр или игнорирования несамостоятельных символов, поскольку это затрудняет сортировку, импорт и экспорт данных при копировании, а также извлечение данных клиентскими приложениями и может привести к потере или повреждению данных.
- Никогда не разрешайте использовать в доменных именах символы, которые запрещены в IDNA2008.
Подробнее о нормализации Unicode см. здесь и здесь.
Выравнивание и преобразование регистра
Выравнивание и преобразование регистра — это процесс приведения всех символов в
строке к одному регистру, обычно нижнему. Преобразование верхнего регистра [AZ] в
нижний регистр [az] эффективно срабатывает только для текстовых документов ASCII,
но гораздо сложнее в языках, использующих дополнительные символы.
Преобразование регистра символов может быть контекстно-зависимым, например, в
случае различных форм греческой сигмы. Оно также может быть обусловлено
языковым стандартом, когда преобразуемый символ зависит от локали, в которой
интерпретируется текст, например, турецкая буква I с точкой и без точки в верхнем и
нижнем регистрах. Выравнивание регистра не зависит от локали и полученные строки
будут интерпретироваться программным обеспечением, в то время как
преобразование регистра зависит от локали и предназначено для чтения текста
человеком. Наконец, преобразование в верхний регистр и преобразование в нижний
регистр — не являются обратными функциями.
IDNA2008 позволяет приложениям использовать для IDN-доменов любое подходящее
преобразование регистра, поскольку такое преобразование выполняется до проверки
символов. На практике зависящего от локали преобразования идентификаторов
не существует, и все используют правила преобразования из UTS#46 Unicode.
Советы разработчикам программного обеспечения
- Учитывайте поставленную цель, прежде чем пытаться преобразовать регистр: это произвольный набор букв, строка на известном языке или что-то еще?
- Выполняйте нормализацию Unicode до выравнивания регистра.