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é.com
和 www.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/rfc5892rfc5894 section 3.1.3 指定在以下情况下可能不允许使用字符:
字符是大写形式或其他形式 通过 Unicode 大小写折叠映射到另一个字符。
【讨论】:
www.olé.com
和 www.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
RFC3986 - 哪些 pchars 需要进行百分比编码?
The valid characters are defined in RFC 7230 and RFC 3986
Java URL 类 getPath()、getQuery() 和 getFile() 与 RFC3986 URI 语法不一致