URL编码问题
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。
下面就让我们看看,“URL编码”到底有多混乱。我会依次分析四种不同的情况,在每一种情况中,浏览器的URL编码方法都不一样。
- 情况1:网址路径中包含汉字
网址路径的编码,不管是IE还是Firefox都是用的是utf-8编码。
- 情况2:查询字符串包含汉字
对于查询字符串的编码,需要依赖操作系统,用的是操作系统的默认编码。一般来说Window中文操作系统默认为GB2312编码,所以查询字符串的编码使用GB2312。
- 情况3:Get方法生成的URL包含汉字
在已打开的网页上,当用用Get或Post方法发出HTTP请求,例如提交表单。这时编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。
- 情况4:Ajax调用的URL包含汉字
在Ajax调用中,IE和Firefox的处理方式完全不一样,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。
面对如此多种情况,解决的办法是借助于javascript,通过js对url进行编码,然后再提交给服务器,不要给浏览器插手的机会。因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。
javascript的编码函数可以使用encodeURI()或encodeURIComponent(),还有一个escape(),不提倡使用,对于encodeURI和encodeURIComponent输出的结果都是utf-8形式,并且在每个字节前加上%,所以服务器端就可以进行按utf-8统一解码,encodeURI和encodeURIComponent区别如下:。
encodeURI不编码字符有82个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ‘,(,),*,-,.,_,~,0-9,a-z,A-Z
本文系转载,原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html