对于非英语字符,RFC 3986中"不区分大小写"的含义是什么?

Mar*_*ter 5 uri utf-8 ucs rfc3986

RFC 3986指定URI 的主机组件是"不区分大小写".但是,它没有指定"不区分大小写"在UCS或UTF-8字符方面的含义.

RFC中给出的示例(例如" <HTTP://www.EXAMPLE.com/>等于<http://www.example.com/>")允许我们推断"不区分大小写"意味着至少表示字符AZ被认为等同于UTF-8字符集中它们之前的字符32,即AZ.但是,没有提到应如何处理该范围之外的字符.因此,鉴于非编码,非标准化的注册名称www.OLÉ.com,我看到RFC允许的三种可能的标准化形式:

  1. 小写到www.olé.com然后百分比编码到www.ol%E9.com
  2. 小写只有AZ字符到www.olÉ.com然后百分比编码到www.ol%C9.com
  3. 百分比编码到www.OL%C9.com,然后将非百分比编码的部分小写到www.ol%C9.com,产生与2相同的结果.

所以问题是:哪个是正确的?如果是情况1.,什么定义哪些字符被认为是大写,哪些字符被认为是小写(哪些字符没有大小写)?

Tim*_*eld 4

DNS解析的主机名始终为小写。

\n

DNS 主机名中不可能包含 UTF-8 字符(RFC 1123),但是,已经通过“国际化域名”实施了解决方法。此解决方法通常称为punycode

\n

Punycode 使非 ASCII 字符可以用 ASCII 字符表示。

\n
\n

非 ASCII 字符由主机名标签中允许的 ASCII 字符(字母、数字和连字符)表示。

\n
\n
\n

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

\n
\n

至于您在问题( )中提供的示例,将解析的域名不是www.ol\xc3\xa9.comwww.ol % E9.com。

\n

如果您的域名中出现百分号,则意味着您对主机名进行了 URL 编码,但这是不正确的,至少对于解析而言是不正确的。

\n

例如,具有a如下所示的标签将正常工作:

\n
<a href="//www.ol%C3%A9.com">Click Here</a>\n
Run Code Online (Sandbox Code Playgroud)\n

但是,DNS 服务器不会解析www.ol%C3%A9.com,而是将转换后的域名解析为 punycode:

\n

例子

\n
www.ol%C3%A9.com\n
Run Code Online (Sandbox Code Playgroud)\n

变成

\n
www.ol\xc3\xa9.com\n
Run Code Online (Sandbox Code Playgroud)\n

在 punycode 中翻译为:

\n
www.xn--ol-cja.com\n
Run Code Online (Sandbox Code Playgroud)\n

Web 浏览器通常会将大写字符转换为小写版本。例如, 和www.ol\xc3\xa9.comwww.ol\xc3\x89.com转换为相同的 DNS 主机名 ( www.xn--ol-cja.com),因为www.ol\xc3\x89.com已小写为www.ol\xc3\xa9.com

\n

我推荐两种工具来检查 IDN 域名,以了解域名经过 punycode 翻译后的样子:

\n\n

Verisign 的 IDN 工具要严格得多。尝试使用这两个工具www.ol\xc3\x89.com作为输入,看看我的意思。

\n

IDNA(应用程序国际化域名)的规则很复杂,但有两个主要的 RFC 值得一看:

\n
    \n
  • 国际化域名应用程序 (IDNA):背景、解释和基本原理
    https://www.rfc-editor.org/rfc/rfc5894
  • \n
  • 应用程序的 Unicode 代码点和国际化域名
    https://www.rfc-editor.org/rfc/rfc5892
  • \n
\n

rfc5894 第 3.1.3 节指定在以下情况下可能不允许使用字符:

\n
\n
    \n
  • 该字符是大写形式或通过 Unicode 大小写折叠映射到另一个字符的其他形式。
  • \n
\n
\n