Punycode

редактировать

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

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

Содержание

  • 1 Процедура кодирования
    • 1.1 Разделение символов ASCII
    • 1.2 Кодирование символов, отличных от ASCII вставки в виде кодовых номеров
    • 1.3 Перекодирование кодовых номеров в виде последовательностей ASCII
  • 2 Примеры
  • 3 Интернационализированные доменные имена
  • 4 См. также
  • 5 Ссылки
  • 6 Внешние ссылки

Кодирование процедура

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

Разделение символов 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, конец ASCII) и «ü» (кодовая точка 252) есть 124 кодовых точки. Также есть одна позиция для вставки «ü», которую нужно пропустить (в нулевой позиции перед «b»). Вот почему необходимо указать декодеру пропустить всего (6 × 124) + 1 = 745 возможных вставок, прежде чем перейти к требуемой. После того, как символ вставлен, теперь есть семь возможных мест для вставки другого символа.

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

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

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

В этом случае используется система счисления из 36 символов, при этом без учета регистра от 'a' до 'z', равный десятичным числам от 0 до 25, и от '0' до «9» соответствует десятичным числам от 26 до 35. Таким образом, «kva» соответствует строке десятичных чисел «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, что означает, что это последняя (наиболее значимая) часть числа. Следовательно, «kva» представляет собой десятичное число (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 для различных типов ввода.

ВходPunycode вводаОписание ввода
Пустая строка.
aa-Только символы ASCII, одна строчная буква.
AA-Только символы ASCII, один в верхнем регистре.
33-Только символы ASCII, единица, цифра.
---Только символы ASCII, один, дефис.
-----Только символы ASCII, два дефиса.
ЛондонЛондон-Только символы ASCII, более одного, без дефисов.
Ллойд-АткинсонЛлойд-Аткинсон-Только символы ASCII, один дефис.
В нем есть пробелы.В нем есть пробелы -Только символы ASCII с пробелами.
->1,00 $ <-->1,00 $ <--Только символы ASCII, смешанные символы.
ütdaБез символов ASCII, один дополнительный символ Latin-1.
αmxaБез символов ASCII, один греческий символ.
fsqБез символов ASCII, один символ CJK.
😉n28hБез символов ASCII, один символ эмодзи.
αβγmxacdБез символов ASCII, более одного символа.
MünchenMnchen-3yaСмешанная строка, в которой один символ не является символом ASCII.
Mnchen-3yaMnchen-3ya-Только символы ASCII, равные Punycode «München» (эффективно кодирует «München» дважды).
München-OstMnchen-Ost-9dbСмешанная строка с одним символом, не являющимся ASCII, и дефисом.
Bahnhof München-OstBahnhof Mnchen-Ost-u6bСмешанная строка с одним пробелом, одним дефисом и одним символом, не являющимся ASCII.
abæcdöefabcdef-qua4kСмешанная строка, два не-ASCII символа.
правда80aafi6cgРусский, без ASCII.
ย จ ฆ ฟ ค ฏ ข22cdfh1b8fsaТайский, без ASCII.
도메인hq1bm8jm9lкорейский, без ASCII.
ド メ イ ン 名 例eckwd4c7cu47r2wfЯпонский без ASCII.
Maji で Koi す る 5 秒 前MajiKoi5-783gue6qz075azm5eЯпонский с ASCII.
「bücher」bcher-kva8445foaСмешанные не-ASCII сценарии (приложение Latin-1 и CJK).

Интернационализированные доменные имена

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

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-06-02 10:54:29
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте