utf-8 - 对于非英语字符, 'case insensitive' 在 RFC 3986 中意味着什么?

标签 utf-8 uri rfc3986 ucs

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 允许的三种潜在的标准化形式:

  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 相同的结果。

所以问题是:哪个是正确的?如果是情况 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).

-- 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 值得一看:

  • 国际化域名申请 (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/

相关文章:

zend-framework - 在 zend 框架中正确使用语言

swift - 什么样的 URL 不符合 RFC 3986 但符合 RFC 1808、RFC 1738 和 RFC 2732?

utf-8 - 使用 Go 从连接中读取 utf8 编码的数据

mysql - MySQL 如何在 UTF-8 中工作 "case insensitive"和 "accent insensitive"

python - 为什么我不能解码这个 UTF-8 页面?

java - 使用 Java 获取存档中文件的文件或 URI 对象?

c# - WPF Glyphs 控制字体 uri!(它很慢并且保留在内存中)

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

http - URL "scheme plus authority"的正式名称

objective-c - 如何在 iphone sdk 中将 NSString 转换为 UTF-8 格式的字符串?