Нормализатор Unicode

Одна и та же видимая строка может храниться как разные последовательности байтов в зависимости от того, существует ли акцент как одна кодовая точка или как буква плюс комбинируемый знак. Этот нормализатор преобразует текст между четырьмя формами нормализации Unicode (NFC, NFD, NFKC, NFKD), чтобы ваши строки чисто сравнивались в базах данных, поисковых индексах, скриптах дедупликации и совпадениях регулярных выражений.

Как нормализовать текст Unicode

  1. 1

    Вставьте ввод

    Вставьте строку: буквы с акцентами, текст CJK, лигатуры, всё, что кажется несогласованным.

  2. 2

    Выберите форму

    Выберите NFC (составленная, привычная веб-форма), NFD (разложенная), NFKC (совместимая составленная) или NFKD (совместимая разложенная).

  3. 3

    Сравните значения

    Инструмент сообщает число символов (кодовых точек) и длину в байтах до и после, чтобы вы видели, укоротила форма строку или удлинила.

  4. 4

    Скопируйте нормализованный результат

    Используйте результат в базе данных, в полезной нагрузке API, в генераторе слагов или в тестовой фикстуре.

Четыре формы и когда применять каждую

Нормализация Unicode определена стандартным приложением UAX #15. Четыре формы различаются по двум осям: каноническая против совместимости и составленная против разложенной.

Сравнение бок о бок

Форма Композиция Сопоставление Когда использовать
NFC Составленная Только каноническое По умолчанию для веб-контента, баз данных, имён файлов
NFD Разложенная Только каноническое Обработка текста, убирающая акценты посимвольно
NFKC Составленная Включая совместимость Поиск, идентификаторы, спам-фильтры, свёртка для отображения
NFKD Разложенная Включая совместимость Агрессивная нормализация перед удалением диакритики

Канонические формы сохраняют смысл

Введите é и переключайте формы. NFC сообщает 1 символ и 2 байта (одна кодовая точка U+00E9), а NFD сообщает 2 символа и 3 байта (простая e, за которой идёт комбинируемый акут, U+0301). Оба выглядят на экране одинаково, но это разные последовательности байтов, и именно это расхождение устраняет нормализация. Канонические формы лишь переставляют байты, поэтому é в любой из форм всегда означает букву e с акутом.

Что на самом деле меняет «совместимость»

Формы K (NFKC, NFKD) переписывают ещё и символы, которые выглядят родственно, но несут иное оформление. Это операция с потерями: вернуть оригинал не получится. Например:

  • fi (U+FB01, латинская малая лигатура fi) становится fi (две буквы)
  • ① (U+2460, цифра один в кружке) становится 1
  • ㌀ (U+3300, квадратный CJK-символ «апаато») становится アパート
  • Полноширинная A (U+FF21) становится A

Это мощно для поиска и дедупликации, но разрушительно для типографики, поэтому прибегайте к формам K только тогда, когда визуальная точность не важна.

Практическое правило

  • Храните пользовательский контент в NFC.
  • Сравнивайте идентификаторы в NFC, чтобы café, записанная одной кодовой точкой, и café, записанная как e + U+0301, совпадали; переходите к NFKC, когда нужно, чтобы совпадали также fi и fi или полноширинная A и A, как это делают правила идентификаторов в UAX #31.
  • Создавайте слаги без акцентов, нормализуя к NFD и удаляя блок комбинируемых знаков от U+0300 до U+036F.

Часто задаваемые вопросы

Обычно это значит, что ваш ввод уже был в целевой форме. Вставьте текст, смешивающий источники (имя файла с Mac, скопированный фрагмент PDF, строку из старой базы данных), и вы гораздо вероятнее увидите изменение числа символов и байтов.

Для отображаемых URL берите NFC. Для слагов, где нужен чистый ASCII, нормализуйте к NFD, удалите комбинируемые знаки регулярным выражением по диапазону от U+0300 до U+036F, а затем переведите в нижний регистр. NFKD подойдёт, когда вы хотите также свернуть лигатуры и цифры в кружках.

Канонические формы (NFC, NFD) никогда не меняют смысл, они лишь переставляют байты. Формы совместимости (NFKC, NFKD), напротив, меняют его: лигатуры распадаются, полноширинные буквы сворачиваются, верхние индексы выравниваются. Используйте их только тогда, когда именно этого и хотите.

Нормализация выполняется на нашем сервере через класс Normalizer в PHP, и результат возвращается в том же запросе; ваш текст не сохраняется. Мы записываем только анонимное событие с указанием применённой формы, но никогда само содержимое.

Сопутствующие инструменты

Генератор названий городов

Создавайте вымышленные названия городов, посёлков, деревень и столиц для миростроения, карт, игр, историй и тестовых данных с короткими заметками к каждому результату.

Переводчик иконок

Введите английский текст, и каждое слово из встроенного списка получит подходящий эмодзи. Скопируйте результат как текст с эмодзи.

Генератор бегущей строки

Создавайте анимированные бегущие заголовки с настраиваемой скоростью, размером шрифта и цветами. Предпросматривайте CSS-строку marquee или панель объявлений вживую в браузере.

Переводчик Эндермана

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

Генератор шрифтов для Instagram

Генерируйте Unicode-«шрифты» (жирный, курсив, рукописный, моноширинный, фрактура), которые вставляются прямо в ваше био, имя, подписи и комментарии в Instagram.

Символы стрелок для копирования

Копируйте популярные Unicode-стрелки одним щелчком: прямые, двойные, диагональные, крючковые, круговые и треугольные для документов, чатов и дизайна.

Инструмент доступен на других языках