Punycode

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Image
Кодовая таблица ASCII

Punycode ([ˈpjuːniˌkəʊd]) — метод преобразования символов Unicode в ASCII[1], которые только разрешены в доменных именах сайтов.

Punycode был разработан для однозначного преобразования доменных имен в последовательность ASCII-символов. Используется в большинстве браузеров[2]. Существуют также специальные программы или сервисы, называемые Punycode-конвертерами, позволяющие осуществлять кодирование/декодирование последовательности Unicode-символов в ACE и наоборот.

Punycode был разработан для однозначного преобразования доменных имен в последовательность ASCII-символов. Используется в большинстве браузеров[2]. Существуют также специальные программы или сервисы, называемые Punycode-конвертерами, позволяющие осуществлять кодирование/декодирование последовательности символов Unicode в ASCII и наоборот. Может произноситься как паникод, пюникод[3] или пьюникод[4][5].

Причины использования

[править | править код]
Image
Схема основной многоязычной плоскости Юникода

Поскольку человеческие языки могут содержать различные символы, например, ä, ö или ü, а в стандарт для системы доменных имен разрешает использовать только символы, содержащиеся в стандарте ASCII. Последний представляет собой набор из 128 кодов символов, тогда как Unicode 17 версии содержит уже 159 866 символов. Особенность Punycode, как преобразователя Unicode в ASCII и в обратную сторону состоит в следующем:

  1. Если в слове много букв из одного алфавита (например, кириллицы), разница между их кодами мала, и Punycode закодирует их очень короткими последовательностями.
  2. Любая последовательность Unicode имеет только один вариант представления в Punycode, и наоборот.

Правила преобразования

[править | править код]

Правила преобразования зафиксированы в стандарте RFC 3492[6]. Вот упрощенное описание алгоритма:

  1. Сепарация базовых символов. Алгоритм сначала копирует все символы исходной строки, которые уже являются базовыми (латиница, цифры, дефис), в начало выходной строки. Если в строке были не-ASCII символы, после базовых ставится разделитель — дефис -.
    • Пример: münchenmnchen-3ya
  2. Инкрементальное кодирование (Delta Encoding). Оставшиеся не-ASCII символы не кодируются напрямую. Вместо этого алгоритм сортирует их по кодовым точкам Unicode и вычисляет разность (delta) между текущим и предыдущим символом, а также учитывает их позиции в строке. Это позволяет эффективно сжимать данные, так как символы одного алфавита обычно расположены в Unicode близко друг к другу.
  3. Смешанная система счисления (Variable-length mixed-radix). Вычисленные значения «дельт» преобразуются в последовательность ASCII-символов с использованием специальной системы счисления, где веса разрядов адаптируются в процессе работы, чтобы короткие последовательности соответствовали наиболее вероятным значениям.

К полученной ASCII-строке добавляется префикс xn--, чтобы DNS-клиенты могли идентифицировать её как закодированный IDN-домен.

Примечания

[править | править код]
  1. Paul Hoffman. RACE: Row-based ASCII Compatible Encoding for IDN (англ.). tools.ietf.org (16 октября 2000). Дата обращения: 13 марта 2020. Архивировано 21 июня 2020 года.
  2. 1 2 Результаты проведённого компанией REG.RU тестирования работы браузеров с доменом .РФ. REG.RU (30 июня 2010). Дата обращения: 30 сентября 2010. Архивировано из оригинала 22 августа 2010 года.
  3. Куда движется DNS, и прав ли ICANN / Хабр. Дата обращения: 31 декабря 2023. Архивировано 31 декабря 2023 года.
  4. Что такое punycode конвертер и зачем он нужен? Дата обращения: 31 декабря 2023. Архивировано 31 декабря 2023 года.
  5. Эмоджи-домены: возможно ли, что они станут будущим Интернета? Дата обращения: 31 декабря 2023. Архивировано 31 декабря 2023 года.
  6. Adam M. Costello. Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA). — Internet Engineering Task Force, 2003-03. — RFC 3492.