RFC 3986 指定 host component URI 的“不区分大小写”。但是,它没有指定“不区分大小写”在 UCS 或 UTF-8 字符方面的含义。
RFC 中给出的示例(例如“<HTTP://www.EXAMPLE.com/
> 相当于 <http://www.example.com/
>”)允许我们推断“不区分大小写”至少意味着字符 A-Z 被视为等同于它们前面的字符 32 UTF-8 字符集中,即 a-z。但是,没有提及应如何处理此范围之外的字符。因此,给定一个非编码、非规范化的注册名称 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 相同的结果。
所以问题是:哪个是正确的?如果是情况 1,什么定义了哪些字符被视为大写,哪些字符被视为小写(以及哪些字符没有大小写)?
最佳答案
由 DNS 解析的主机名始终为小写。
是not possible to have UTF-8 characters in DNS hostnames (RFC 1123)但是,已经针对“国际化域名”制定了解决方法。此解决方法通常称为 punycode .
Punycode 使非 ASCII 字符可以用 ASCII 字符表示。
non-ASCII characters are represented by ASCII characters that are allowed in host name labels (letters, digits, and hyphens).
就您在问题中提供的示例 (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
Web 浏览器通常会将大写字符转换为小写版本。例如,www.olé.com
和 www.olÉ.com
均转换为相同的 DNS 主机名 (www.xn--ol-cja.com
),因为 www.olÉ.com
小写为 www.olé.com
。
我推荐两个工具来检查 IDN 域名,以了解域名经过 punycode 翻译后的样子:
- Verisign 的 IDN 转换工具 ( http://mct.verisign-grs.com/ )
- Punycoder Punycode 到文本/Unicode https://www.punycoder.com/
Verisign 的 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指定在以下情况下可能不允许使用字符:
- The character is an uppercase form or some other form that is mapped to another character by Unicode case folding.
关于utf-8 - 对于非英语字符, 'case insensitive' 在 RFC 3986 中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7780359/