Что такое 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 | Арабский |
| CJK | U+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