RFC 3986指定URI的host component是“不区分大小写”。但是,它没有指定“不区分大小写”在UCS或UTF-8字符方面的含义。
RFC中给出的示例(例如“<HTTP://www.EXAMPLE.com/
&gt;相当于<http://www.example.com/
&gt;”)允许我们推断“不区分大小写”至少意味着字符AZ被认为等同于UTF-8字符集中前面的字符32,即az。但是,没有提到应如何处理该范围之外的字符。因此,鉴于非编码,非标准化的注册名称www.OLÉ.com,我认为RFC允许三种可能的标准化形式:
所以问题是:哪个是正确的?如果是这种情况1.什么定义哪些字符被认为是大写字母,哪些字符被认为是小写字母(哪些字符没有大小写)?
答案 0 :(得分:1)
DNS的主机名已解决始终为小写。
它是not possible to have UTF-8 characters in DNS hostnames(RFC 1123),然而,已经采用了#34;国际化域名&#34;的解决方法。此解决方法通常称为punycode。
Punycode允许非ASCII字符用ASCII字符表示。
非ASCII字符由主机名标签(字母,数字和连字符)中允许的ASCII字符表示。
至于您在问题中提供的示例(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工具更加严格。尝试使用www.olÉ.com
作为输入的两个工具来查看我的意思。
IDNA(应用程序的国际化域名)规则很复杂,但有两个主要的RFC值得一看:
rfc5894 section 3.1.3指定在以下情况下不允许使用 字符
- 字符是大写形式或其他形式 通过Unicode case folding映射到另一个字符。