RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?

Posted

技术标签:

【中文标题】RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?【英文标题】:What does 'case insensitive' mean in RFC 3986 with respect to non-English characters?RFC 3986 中关于非英文字符的“不区分大小写”是什么意思? 【发布时间】:2011-12-08 11:37:19 【问题描述】:

RFC 3986 指定 URI 的 host component 是“不区分大小写”的。但是,它没有具体说明“不区分大小写”在 UCS 或 UTF-8 字符方面的含义。

RFC 中给出的示例(例如“<HTTP://www.EXAMPLE.com/> 等同于<http://www.example.com/>”)允许我们推断“不区分大小写”至少意味着字符 AZ 被认为等同于它们前面的字符 32在 UTF-8 字符集中,即 az。但是,没有提到应该如何处理超出此范围的字符。因此,给定一个非编码、非规范化的注册名称 www.OLÉ.com,我看到了 RFC 允许的三种潜在的规范化形式:

    小写为www.olé.com,然后百分号编码为www.ol%E9.com 仅小写的 A-Z 字符转换为 www.olÉ.com,然后百分比编码为 www.ol%C9.com 百分比编码为 www.OL%C9.com,然后将非百分比编码部分小写为 www.ol%C9.com,产生与 2 相同的结果。

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

【问题讨论】:

你为什么要进行百分比编码?这不是一个有效的域名(编码或未编码)。也许在与punycode 相关的内容中有一些东西? (例如,punycode 是否进行大小写规范化?) RFC 明确规定百分比编码是有效的,并且在 DNS 中注册的域名不是唯一可以使用的注册名称。 RFC:“当一个非 ASCII 注册名称代表一个旨在通过 DNS 解析的国际化域名时,该名称必须在名称查找之前转换为 IDNA 编码 [RFC3490]。URI 生产者如果他们希望最大限度地与旧版 URI 解析器的互操作性,则应以 IDNA 编码而不是百分比编码提供这些注册名称。" RFC 3490 建立在 NAMEPREP (RFC 3491) 和 PUNYCODE (RFC 3492) 之上,NAMEPREP 将您带到 STRINGPREP (RFC 3454)。 RFC 3454 第 3.2 节“大小写折叠”为您提供了有关 IDN(国际域名)上下文中“不区分大小写”的含义的答案。 @MihaiNita:我认为你的 cmets 会是一个很好的答案。 【参考方案1】:

DNS解析的主机名总是小写的。

它是not possible to have UTF-8 characters in DNS hostnames (RFC 1123),但是,已经采用“国际化域名”的解决方法。此解决方法通常称为punycode。

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

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

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

至于您在问题中提供的示例 (www.olé.com),将被解析的域名是 not 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

Web 浏览器通常会将大写字符转换为小写字符。例如,www.olé.comwww.olÉ.com 都转换为相同的 DNS 主机名 (www.xn--ol-cja.com),因为 www.olÉ.com 被小写为 www.olé.com

我推荐两个工具来检查 IDN 域名,看看域名经过 punycode 翻译后的样子:

威瑞信的 IDN 转换工具 (http://mct.verisign-grs.com/) Punycoder Punycode 到文本/Unicode https://www.punycoder.com/

威瑞信的 IDN 工具要严格得多。尝试使用 www.olÉ.com 作为输入的这两种工具,看看我的意思。

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

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

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

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

【讨论】:

www.olé.comwww.olÉ.com 在 Punycode 中有不同的表示形式。但是用户代理(浏览器)通常会将主机名转换为小写。 www.olÉ.com 在 punycode 中没有表示形式。 但确实如此。 Punycode 表示为www.xn--ol-lga.com。但是,注册此域是不可能的,因为 IDNA 只允许小写名称。 Punycode 允许对任意整数序列进行编码,但大多数在线转换器将对 Unicode 字符串进行一些预处理。试试不预处理输入的this converter。 抱歉,我的意思是,www.olÉ.com 没有有效的 IDNA 表示。

以上是关于RFC 3986 中关于非英文字符的“不区分大小写”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 %(百分比)在 RFC 3986(URI 语法)中不被视为保留字符?

如何让 Uri.EscapeDataString 符合 RFC 3986

RFC 3986 中的 HTTP 请求主机值语法

RFC3986 - 哪些 pchars 需要进行百分比编码?

The valid characters are defined in RFC 7230 and RFC 3986

Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致