2015-06-11 6 views
0

Я искал интернационализированные идентификаторы ресурсов, и меня беспокоила одна вещь.Как punycode различает аналогичные IRI?

Я понимаю, что для каждой метки в имени домена (xyzzy.plugh.com имеет три метки, xyzzy, plugh и com), следующий процесс выполняется, чтобы перевести его в представление ASCII, так что он может быть обработан в порядке по всему наследству программное обеспечение:

  • Если он состоит исключительно из символов ASCII, он копируется как есть.
  • Иначе:
    • Сначала мы выводим xn-- следуют все символы ASCII (пропуск не-ASCII).
    • Затем, если конечный символ не -, мы выводим -, чтобы отделить ASCII от не-ASCII.
    • Наконец, мы кодируем каждый из символов, отличных от ASCII, с использованием punycode, чтобы они выглядели как ASCII.

Мой вопрос тогда: как мы будем различать следующие два Unicode URIs?

http://aa☃.net/ 
http://☃aa.net/ 

Мне кажется, что как из них будет кодировать:

http://xn--aa-nfh.net/ 

просто потому, что информация о последовательности были потеряны для лейбла в целом.

Или я что-то пропустил в спецификации?

ответ

1

Согласно one punycode encoder, есть кодируются по-разному:

aa☃.net -> xn--aa-gsx.net 
☃aa.net -> xn--aa-esx.net 
       ^
        see here 

The relevant RFC 3492 детали, почему это так. Во-первых, он дает ключи во введении:

Уникальность: Существует не более одной базовой строки, которая представляет заданную расширенную строку.

Обратимость: любая расширенная строка, сопоставленная базовой строке, может быть восстановлена ​​из этой базовой строки.

Это означает, что должно быть дифференцируемое взаимно однозначное сопоставление для каждой пары базовых/расширенных строк.

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

Декодер начинается, начиная с только основной строкой aa.net с указателем на первый a, затем применяет серию дельт, такие как gsx или esx.

Дельта фактически кодирует два вещи. Первое - это количество неинтегрированных действий, а второе - фактическое вложение.

Так, gsx (дельта в aa☃.net) будет кодировать два не-вставки (чтобы пропустить aa) с последующим введением . Дельта esx (для ☃aa.net) кодирует нулевые неиндексы, за которыми следует вставка .

Вот как позиция кодируется в основные строки.

+0

brunesto, ваши ссылки заставили меня провести еще несколько исследований, и оказалось, что вы были правы. Добавили мясо расследования, чтобы отразить ваш ответ, надеюсь, что вы не против. – paxdiablo