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

时间:2011-10-15 20:14:37

标签: utf-8 uri rfc3986 ucs

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. 小写到www.olé.com然后百分比编码到www.ol%E9.com
  2. 仅将A-Z字符小写到www.olÉ.com,然后将百分比编码到www.ol%C9.com
  3. 百分比编码至www.OL%C9.com,然后将非百分比编码部分小写至www.ol%C9.com,产生与2相同的结果。
  4. 所以问题是:哪个是正确的?如果是这种情况1.什么定义哪些字符被认为是大写字母,哪些字符被认为是小写字母(哪些字符没有大小写)?

1 个答案:

答案 0 :(得分:1)

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

它是not possible to have UTF-8 characters in DNS hostnames(RFC 1123),然而,已经采用了#34;国际化域名&#34;的解决方法。此解决方法通常称为punycode

Punycode允许非ASCII字符用ASCII字符表示。

  

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

     

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

至于您在问题中提供的示例(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é.comwww.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映射到另一个字符。
  •