Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Punycode - это представление Unicode с ограниченным набором символов ASCII, используемым для имен хостов в Интернете . Используя Punycode, имена хостов, содержащие символы Unicode, перекодируются в подмножество ASCII, состоящее из букв, цифр и дефисов, которое называется подмножеством букв-цифр-дефисов (LDH). Например, München ( немецкое название Мюнхена ) кодируется как Mnchen-3ya .

В то время как система доменных имен (DNS) технически поддерживает произвольные последовательности октетов в метках доменных имен, стандарты DNS рекомендуют использовать подмножество LDH в ASCII, традиционно используемое для имен хостов, и требуют, чтобы сравнения строк между именами доменов DNS проводились в регистре: нечувствительный. Синтаксис Punycode - это метод кодирования строк, содержащих символы Unicode, такие как интернационализированные доменные имена (IDNA), в подмножество LDH ASCII, предпочитаемое DNS. Это указано в запросе комментариев IETF 3492. [1]

Процедура кодирования [ править ]

Как указано в RFC 3492, «Punycode является экземпляром более общего алгоритма под названием Bootstring , который позволяет строкам, составленным из небольшого набора« базовых »кодовых точек, однозначно представлять любую строку кодовых точек, взятых из большего набора». Punycode определяет параметры для общего алгоритма Bootstring, чтобы они соответствовали характеристикам текста Unicode. В этом разделе показано процедуры кодирования Punycode, используя пример строки «Bücher» ( Bücher является немецким для книг ), который в переводе на этикетку «bcher-ква».

Разделение символов ASCII [ править ]

Во-первых, все символы ASCII в строке копируются из ввода в вывод, пропуская любые другие символы. Например, «bücher» копируется в «bcher». Если какие-либо символы были скопированы, т. Е. Был хотя бы один символ ASCII во входных данных, следующий дефис ASCII добавляется к выходным данным (например, «bücher» → «bcher-», но «ü» → «»). Поскольку дефис ASCII является символом ASCII, сам дефис может появляться в выводе перед этим дополнительным дефисом. Однако дополнительный дефис не вызывает двусмысленности при чтении вывода, поскольку никакая последующая часть процесса кодирования не может ввести другой дефис ASCII; если в выводе есть один или несколько дефисов ASCII, последний всегда означает конец символов ASCII.

Кодирование вставок символов, отличных от ASCII, в виде кодовых номеров [ править ]

Следующая часть процесса кодирования сначала требует понимания декодера, который представляет собой конечный автомат с двумя переменными состояния i и n . i - это индекс строки в диапазоне от нуля (представляющий потенциальную вставку в начале) до текущей длины расширенной строки (представляющий потенциальную вставку в конце).

i начинается с нуля, а n начинается с 128 (первая кодовая точка, отличная от ASCII). Прогресс состояния - монотонная функция . Изменение состояния либо увеличивает i, либо, если i находится на максимальном уровне, сбрасывает i в ноль и увеличивает n на 1, а затем возвращается к увеличению i при следующем изменении состояния. При каждом изменении состояния либо вставляется кодовая точка, обозначенная n, либо она не вставляется.

Кодовые числа, сгенерированные кодировщиком, представляют, сколько возможностей пропустить до того, как будет произведена вставка. Есть шесть возможных мест для вставки символа в текущую строку «bcher» (включая перед первым символом и после последнего). Между последней рассматриваемой (127 = 0x7F, конец ASCII) и «ü» (кодовая точка 252 = 0xFC, см. Дополнение к Unicode Latin-1 ) имеется 124 кодовых точки . Также есть одна позиция для вставки «ü», которую нужно пропустить (в нулевой позиции перед «b»). Вот почему необходимо указать декодеру пропустить в общей сложности (6 × 124) + 1 = 745 возможных вставок, прежде чем перейти к требуемой. После того, как символ вставлен, теперь есть семь возможных мест для вставки другого символа.

Перекодирование кодовых номеров в виде последовательностей ASCII [ править ]

Punycode использует обобщенные целые числа переменной длины для представления этих значений. Например, вот как слово «ква» используется для обозначения кодового числа 745:

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

В этом случае используется система счисления с 36 символами, при этом нечувствительность к регистру от «a» до «z» соответствует десятичным числам от 0 до 25, а от «0» до «9» - десятичным числам с 26 по 35. Таким образом, «ква» соответствует строке десятичных чисел «10 21 0».

В данном случае для декодирования этой строки символов потребуется последовательность пороговых значений (1, 1, 26). Порог начинается с 1, а вес равен 1. Первый символ - это значение разряда единиц ; «k» (= 10) с весом 1 равняется 10. После этого устанавливается пороговое значение; в этом случае порог снова равен 1. Второй символ имеет разрядное значение.36 минус предыдущее пороговое значение, в данном случае 35. Следовательно, сумма первых двух символов «k» (= 10) и «v» (= 21) составляет 10 × 1 + 21 × 35. Поскольку второй символ не меньше порогового значения 1, это еще не все. Вес третьего символа равен предыдущему весу, умноженному на 36 минус второе пороговое значение; 35 × 35. Третий символ в этом примере - «а» (= 0), который меньше третьего порогового значения 26, что означает, что это последняя (наиболее значимая) часть числа. Следовательно, «ква» представляет собой десятичное число (10 × 1) + (21 × 35) + (0 × 35 × 35) = 745.

Сами пороговые значения определяются для каждого последовательного кодируемого символа с помощью алгоритма, поддерживающего их от 1 до 26 включительно, что означает, что последний символ кодирования всегда будет буквенным. Затем регистр можно использовать для предоставления информации об исходном регистре строки.

Для вставки второго специального символа в "bücher" первая возможность - "büücher" с кодом "bcher-kvaa", вторая "bücüher" с кодом "bcher-kvab" и т. Д. После "bücherü" с кодом " bcher-kvae "имеет коды, представляющие вставку ý, символа, следующего за ü, начиная с" ýbücher "с кодом" bcher-kvaf "(в отличие от" übücher ", закодированного как" bcher-jvab ") и т. д.

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

Punycode разработан для работы со всеми скриптами и для самооптимизации, пытаясь адаптироваться к диапазонам набора символов в строке в процессе работы. Он оптимизирован для случая, когда строка состоит из нуля или более символов ASCII и, кроме того, символов только из одной другой системы сценариев, но справится с любой произвольной строкой Unicode. Обратите внимание, что для использования DNS предполагается, что строка доменного имени была нормализована с помощью Nameprep и (для доменов верхнего уровня ) отфильтрована по официально зарегистрированной языковой таблице перед точным кодированием , и что протокол DNS устанавливает ограничения на допустимую длину вывод строки Punycode.

Примеры [ править ]

В следующей таблице показаны примеры кодировок Punycode для различных типов ввода. [2]

Интернационализированные доменные имена [ править ]

Чтобы предотвратить случайную интерпретацию немеждународных доменных имен, содержащих дефисы, как Punycode, к последовательностям Punycode международных доменных имен добавлен так называемый префикс ASCII-совместимого кодирования (ACE), «xn--». [3] Таким образом, доменное имя «bücher.tld» будет представлено в ASCII как «xn - bcher-kva.tld».

См. Также [ править ]

Ссылки [ править ]

  1. ^ RFC 3492, Punycode: кодирование начальной строки Unicode для интернационализированных доменных имен в приложениях (IDNA) , А. Костелло, The Internet Society (март 2003 г.)
  2. ^ Punycode в этой таблице был создан с использованием встроенного кодека «punycode» языка программирования Python версии 3.8 (s.encode («punycode»)). См. Страницу обсуждения .
  3. ^ Internet Assigned Numbers Authority (14 февраля 2003 г.). «Завершение выбора префикса IDNA IANA» . www.atm.tut.fi . Архивировано из оригинала на 2010-04-27 . Проверено 22 сентября 2017 .

Внешние ссылки [ править ]

  • Стандарт IETF Punycode
  • Демонстрация ICU IDNA Онлайн-демонстрация того, как ICU выполняет операции IDN
  • Список TLD, которые, по мнению разработчиков Mozilla, имеют эффективную политику защиты от спуфинга для регистрации имени
  • IDN и Punycode в IE7
  • Простой конвертер Punycode
  • Онлайн-конвертер Punycode на лету на основе библиотеки JavaScript Punycode.js
  • Модульный онлайн-конвертер, предлагающий Punycode и Bootstring