Что означает «нечувствительный к регистру» в RFC 3986 в отношении неанглийских символов?

В RFC 3986 указано, что компонент хоста URI нечувствителен к регистру. . Однако в нем не указано, что означает «без учета регистра» в отношении символов UCS или UTF-8.

Примеры, приведенные в RFC (например, «<HTTP://www.EXAMPLE.com/> эквивалентно <http://www.example.com/>»), позволяют нам сделать вывод, что «нечувствительный к регистру» означает, по крайней мере, что символы A-Z считаются эквивалентными символу 32 перед ними в наборе символов UTF-8. , то есть а-я. Однако не упоминается, как следует обрабатывать символы за пределами этого диапазона. Таким образом, учитывая незакодированное, ненормализованное зарегистрированное имя www.OLÉ.com, я вижу три возможных формы нормализации, разрешенных RFC:

  1. Нижний регистр для www.olé.com, затем процентное кодирование для www.ol%E9.com
  2. Только строчные символы A-Z для www.olÉ.com, а затем процентное кодирование для www.ol%C9.com
  3. Процентное кодирование до www.OL%C9.com, а затем строчными буквами непроцентно закодированные части до www.ol%C9.com, что дает тот же результат, что и 2.

Так вот вопрос: что правильно? Если это случай 1., что определяет, какие символы считаются прописными, а какие строчными (и какие символы не имеют регистра)?


person Mark Slater    schedule 15.10.2011    source источник
comment
Почему вы используете процентное кодирование? Это недопустимое доменное имя (закодированное или не закодированное). Возможно, есть что-то в материале, касающемся punycode? (Например, выполняет ли punycode нормализацию регистра?)   -  person    schedule 16.10.2011
comment
RFC явно указывает, что процентное кодирование допустимо и что доменные имена, зарегистрированные в DNS, не являются единственным типом зарегистрированных имен, которые можно использовать.   -  person Mark Slater    schedule 16.10.2011
comment
RFC: когда зарегистрированное имя, отличное от ASCII, представляет собой интернационализированное доменное имя, предназначенное для разрешения через DNS, имя должно быть преобразовано в кодировку IDNA [RFC3490] перед поиском имени. Производители URI должны предоставлять эти зарегистрированные имена в кодировке IDNA, а не в процентном кодировании, если они хотят максимизировать совместимость с устаревшими преобразователями URI.   -  person Mihai Nita    schedule 03.06.2013
comment
RFC 3490 основан на NAMEPREP (RFC 3491) и PUNYCODE (RFC 3492), а NAMEPREP приводит вас к STRINGPREP (RFC 3454). А раздел 3.2 Свертывание регистра RFC 3454 дает вам ответ на вопрос, что означает нечувствительность к регистру в контексте IDN (международных доменных имен).   -  person Mihai Nita    schedule 03.06.2013
comment
@MihaiNita: Я думаю, ваши комментарии станут хорошим ответом.   -  person unor    schedule 05.01.2014
comment
Согласен: @MihaiNita, если ты сделаешь это ответом, я приму его.   -  person Mark Slater    schedule 08.01.2014
comment
@MihaiNita RFC 3490 (IDNA2003) был заменен RFC 5890 (IDNA2008). Последний устраняет этап NAMEPREP и просто запрещает использование всех символов верхнего регистра. RFC 5895 предлагает приложениям использовать стандартный алгоритм преобразования регистра Unicode для преобразования IDN в нижний регистр.   -  person nwellnhof    schedule 02.11.2015


Ответы (1)


Имена хостов, разрешенные DNS, всегда пишутся строчными буквами.

Однако невозможно использовать символы UTF-8 в именах хостов DNS (RFC 1123), обходной путь был введен в действие с «интернационализированными доменными именами». Этот обходной путь широко известен как punycode.

Punycode позволяет представлять символы, отличные от ASCII, символами ASCII.

символы, отличные от ASCII, представлены символами ASCII, разрешенными в метках имен хостов (буквы, цифры и дефисы).

-- https://www.ietf.org/rfc/rfc3492.txt

Что касается примера, который вы указали в своем вопросе (www.olé.com), доменное имя, которое будет разрешено, не www.ol%E9.com.

Если вы получаете знаки процента в своем доменном имени, это означает, что вы закодировали URL-адрес имени хоста, и это неправильно, по крайней мере, не для разрешения.

Например, правильно будет использовать тег a, который выглядит так:

<a href="//www.ol%C3%A9.com">Click Here</a>

Однако DNS-сервер будет разрешать не www.ol%C3%A9.com, а преобразованное доменное имя в виде punycode:

Пример

www.ol%C3%A9.com

становится

www.olé.com

что в punycode переводится как:

www.xn--ol-cja.com

Веб-браузеры обычно преобразуют символы верхнего регистра в версию нижнего регистра. Например, и www.olé.com, и www.olÉ.com преобразуются в одно и то же имя хоста DNS (www.xn--ol-cja.com), потому что www.olÉ.com было преобразовано в нижний регистр до www.olé.com.

Я рекомендую два инструмента для проверки доменных имен IDN, чтобы увидеть, как выглядит доменное имя после того, как оно пройдет перевод punycode:

Инструмент IDN Verisign гораздо строже. Попробуйте оба инструмента с www.olÉ.com в качестве входных данных, чтобы понять, что я имею в виду.

Правила для IDNA (интернационализированные доменные имена для приложений) сложны, но есть два основных RFC, на которые стоит обратить внимание:

  • Интернационализированные доменные имена для приложений (IDNA): история, объяснение и обоснование
    https://tools.ietf.org/html/rfc5894
  • Кодовые точки Unicode и интернационализированные доменные имена для приложений
    https://tools.ietf.org/html/rfc5892

rfc5894 section 3.1.3 указывает, что символы могут не допускается, если:

  • Символ представляет собой форму в верхнем регистре или какую-либо другую форму, которая отображается на другой символ путем складывания регистра Unicode.
person Tim Groeneveld    schedule 30.10.2015
comment
www.olé.com и www.olÉ.com имеют разные представления в Punycode. Но пользовательский агент (браузер) обычно преобразует имя хоста в нижний регистр, преобразовывая его. - person nwellnhof; 02.11.2015
comment
www.olÉ.com не представлен в punycode. - person Tim Groeneveld; 03.11.2015
comment
Но это так. Представление Punycode — www.xn--ol-lga.com. Однако зарегистрировать этот домен невозможно, потому что IDNA допускает имена только в нижнем регистре. Punycode позволяет кодировать произвольные целочисленные последовательности, но большинство онлайн-конвертеров выполняют некоторую предварительную обработку строк Unicode. Попробуйте использовать этот преобразователь, который не выполняет предварительную обработку входных данных. - person nwellnhof; 03.11.2015
comment
Извините, я хотел сказать, что www.olÉ.com не имеет действительного представления IDNA. - person Tim Groeneveld; 04.11.2015