原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

  • 引入
  • 环境
  • 测试
  • JavaScript 编码函数

 

引入


URL 就是网址,只要上网,就一定会用到。

一般来说,URL 只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,可以有 http://www.abc.com 这样的网址,但绝对不能有 http://www.aβγ.com,包含希腊字母的网址。因为 RFC 1738 有明确的规定:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

“只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于 URL。”

这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738 没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。

下面就让我们看看,“URL编码”到底有多混乱。我会依次分析四种不同的情况,在每一种情况中,浏览器的URL编码方法都不一样。把它们的差异解释清楚之后,我再说如何用Javascript找到一个统一的编码方法。

环境


  • Windows 2003 Server
  • IE 7.0 / Fiddler2
  • Firefox 7.0/17.0/ Firebug

测试


情况1:网址路径中包含汉字

在 IE 7.0 地址栏,输入“http://zh.wikipedia.org/wiki/春节”。注意,此时“春节”是网址路径的一部分。

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 1

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 2

在 Fiddler 查看下,发现左部分 URL 列为 /wiki/%E6%98%A5%E8%8A%82;右部分 HTTP 请求“Raw”页为 http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82

“春”和“节”的 UTF-8 编码分别是 E6 98 A5 E8 8A 82,而 %E6%98%A5%E8%8A%82  按照顺序,在每个字节前加上百分号%,而 IE 自动将“春节”编码 UTF-8 编码。

在 Firefox 7.0/17.0 中测试,可以得到相同的结果。

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 3

因此,网址路径的编码,用的是 UTF-8 编码。

情况2:查询字符串包含汉字

在 IE 7.0 地址栏输入“http://www.baidu.com/s?wd=春节”。此时,“春节”属于查询字符串,不属于网址路径,不要与情况 1 混淆。

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 4

在 Fiddler 查看下,发现左部分 URL 列,以及右部分 HTTP 请求“Header”页,查询字符串的“春节”部分竟然是乱码。如下图所示:

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 5

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 6 上:Raw 页;下:HexView 页

再看下“Raw”页的内容,还是乱码;切换到“HexView”页,只能看十六进制了,发现“春节”转换成“B4 BA BD DA”,如下图所示:

“B4 BA BD DA”是“春节”GB2312 编码,因此,IE 将查询字符串以 GB2312 编码的格式发送出去了。

接下来看 Firefox 7.0 较低版本的处理方法,它略有不同。在地址栏输入后,按回车前与按回车后的区别,如下图所示:

关于 URL 编码及 JavaScript 编码函数【转载+整理】

图 7 左上:按回车前;右上:按回车后;下:Firebug 内容

按回车后,Firefox 7.0 自动将“春节”转换成 GB2131 编码;同样采用 GB2312 编码发送,但 Firefox 7.0 在每个字节前都加了百分号%。

但是 Firefox 17.0 高版本又不一样了,通过 Firebug 可以看到采用 UTF-8 编码。

查询字符串的编码,用的是操作系统的默认编码。

情况3:Get方法生成的URL包含汉字

前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。

根据台湾中兴大学吕瑞麟老师的试验,这时的编码方法由网页的编码决定,也就是由 HTML 源码中字符集的设置决定。

>

相关文章: