读书人

[转]HD9001: 各浏览器对 URI 中非 ASC

发布时间: 2012-08-14 10:39:58 作者: rapoo

[转]HD9001: 各浏览器对 URI 中非 ASCII 字符的处理有差异

作者:孙东国

标准参考

URI 的组成如下所示:

         foo://example.com:8042/over/there?name=ferret#nose         \_/   \______________/\_________/ \_________/ \__/          |           |            |            |        |       scheme     authority       path        query   fragment          |   _____________________|__         / \ /                        \         urn:example:animal:ferret:nose

根据 HTML 4.01 规范中的描述,URI 中不应该包含非 ASCII 字符。如以下 href 属性的值是不合法的
<A href="http://foo.org/H?kon">...</A>

规范中建议,用户端在这种情况下应采取以下方式处理非 ASCII 字符:

  1. 将每个字符转换为 UTF-8 编码的相同字符,每个字符将有一或多个字节。
  2. 用 URI 编码机制对这些字节进行编码。如:每个字节转换为 %HH,其中的 HH 为这些字节的值的十六进制表示。这种方式称为“百分号编码”。

关于 URI 类型及 URI 属性值中的非 ASCII 字符(Non-ASCII characters in URI attribute values)的详细信息,请参考 HTML4.01 规范?6.4 URIs?及?附录B.2.1?中的内容。

关于“百分号编码”的详细信息,请参考 RFC-3986?2.1. Percent-Encoding?中的内容。

关于 URI 组成的更多信息,请参考 RFC-3986?3. Syntax Components?中的内容。

问题描述

对于 URI 中非 ASCII 字符,并非所有浏览器都是按照 HTML 4.01 规范中的建议实现的,而且不同浏览器在处理不同形式的 URI 时,表现也有差异。

造成的影响

这个问题将导致在服务端或客户端通过代码获取 URI 中的非 ASCII 字符信息时无法分辨编码信息,并产生乱码。

受影响的浏览器所有浏览器?

问题分析

下面测试各种情况下各浏览器对于 URI 中非 ASCII 字符的编码方式。

在应用中经常使用的编码是 GB2312 和 UTF-8,一个汉字在 GB2312 编码下占 2 个字节,在 UTF-8 编码下占 3 个字节,因此通过对比这两种编码更容易看出区别。下面的例子中将分别使用这两种编码测试。

读书人网 >移动开发

热点推荐