Unicode

Протоколы и стандарты
Универсальный стандарт, кодирующий символы письменностей мира для совместимого цифрового обмена.
← Вернуться к глоссарию

Что такое Unicode?

Unicode задаёт универсальные кодовые точки для символов разных письменностей, знаков и эмодзи. Он отделяет идентичность символа от конкретного способа кодирования, например UTF-8, UTF-16 или UTF-32.

Unicode в доменных именах

Международные доменные имена позволяют использовать локальные письменности. В интерфейсе имя может отображаться в Unicode, а в DNS передаваться в ASCII-совместимой форме Punycode по правилам IDNA.

Поддержка IDN

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

Преобразование в Punycode

Метки с не-ASCII символами преобразуются в форму с префиксом xn--. Для проверки сохраняйте исходное отображение и канонический Punycode, чтобы запросы RDAP, DNS и TLS относились к одному имени.

Unicode: münchen.de

Punycode: xn--mnchen-3ya.de

Unicode: 北京.中国

Punycode: xn--1lq90i.xn--fiqs8s

Кодовые точки Unicode

Каждому символу назначается кодовая точка вида U+XXXX или более длинная шестнадцатеричная запись. Одинаковый вид на экране не означает одинаковую кодовую точку.

Структура кодовой точки

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

Format: U+XXXX (hexadecimal)

Examples:

A = U+0041 (Latin A)

а = U+0430 (Cyrillic a)

中 = U+4E2D (Chinese character)

Блоки символов

Стандарт группирует диапазоны в блоки, например Basic Latin, Cyrillic и CJK Unified Ideographs. Блок удобен для навигации, но не является сам по себе правилом языка или допустимости домена.

БлокДиапазонСкрипт
Основная латиницаU+0000-007FАнглийский/ASCII
КириллицаU+0400-04FFРусский и другие языки
АрабскийU+0600-06FFАрабский
CJKU+4E00-9FFFКитайский/японский/корейский

Риски безопасности

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

Атаки с гомоглифами

Злоумышленник может заменить латинский символ похожим кириллическим или греческим знаком. Проверяйте скрипты, кодовые точки, Punycode, сертификат и фактический hostname, а не только внешний вид.

Latin 'a' (U+0061) vs Cyrillic 'а' (U+0430)

Latin 'o' (U+006F) vs Cyrillic 'о' (U+043E)

Attack: аpple.com (Cyrillic 'а') looks like apple.com

Защита в браузерах

Браузеры могут показывать Punycode для подозрительных сочетаний скриптов или применять собственные списки разрешённых символов. Это снижает риск, но не заменяет проверку адреса, TLS и источника ссылки.

Нормализация Unicode

Один визуальный символ может состоять из одной кодовой точки или базового знака с комбинируемым акцентом. Формы NFC, NFD, NFKC и NFKD решают разные задачи, поэтому приложение должно выбрать и документировать безопасную стратегию сравнения.

é = U+00E9 (precomposed)

é = U+0065 + U+0301 (decomposed: e + combining accent)

Normalization forms: NFC, NFD, NFKC, NFKD

Применяйте эти знания на практике

Используйте API DomScan для проверки доступности доменов, их состояния и многого другого.