Сравнение текстов: нормализация, регистр и транслитерация

Разграничение нормализации Unicode, обработки регистра и транслитерации при сравнении текстов, с конкретным примером парных символов и указанием на необходимость явной политики сравнения.

Сравнение текстов: нормализация, регистр и транслитерация

Предмет

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

Нормализация и её формы

Формы NFC и NFD используют каноническую композицию и декомпозицию соответственно. NFKC и NFKD дополнительно применяют совместимые отображения, которые, например, превращают лигатуру ff в последовательность ff. При этом NFC слагает только те пары, для которых каноническая композиция определена в стандарте, а не любые произвольные базовый символ плюс знак. Нормализация не делает латинскую A идентичной кириллической А и не удаляет акценты или невидимые символы как правило: она упорядочивает запись внутри той же системы письма.

Политика сравнения

Нормализация уместна, когда выбрана политика сравнения канонического текста. Сравнение точных байтов, проверка подписи или некоторые протоколы намеренно сохраняют исходное представление, и предварительная нормализация там не требуется. Поэтому нельзя предписывать нормализацию перед каждым сравнением: сначала определяется, что именно должно считаться равным.

Пример с акцентом

Рассмотрим пару É (одна кодовая точка U+00C9) и É (буква E U+0045 плюс знак острого акцента U+0301). В исходном виде они не равны. После нормализации в NFC обе записи становятся одной кодовой точкой U+00C9, и сравнение канонических форм даёт равенство. Это конкретная демонстрация для выбранной пары, а не универсальный алгоритм сравнения: другие пары символов могут вести себя иначе.

Регистр

Приведение к нижнему регистру не является универсальной политикой регистронезависимого сравнения. Для корректного сопоставления без учёта регистра требуется определённая политика: языковой контекст, правила фолдинга или таблица соответствий, предусмотренная стандартом. Ограничение примера с акцентом показывает, что даже нормализация не гарантирует равенства всех визуально похожих записей без явной политики.

Транслитерация

Транслитерация переводит символы между системами письма, например, из кириллицы в латиницу. Обратимость зависит от выбранной схемы: некоторые схемы проектируются как обратимые, другие допускают коллизии, когда разные исходные символы отображаются в одну последовательность. Нельзя утверждать, что всякая транслитерация необратима или что русские ш и щ произносятся одинаково: эти свойства относятся к конкретной схеме и конкретной языковой традиции, а не к операции вообще.