因为网络标准RFC 1738做了硬性规定:只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。
这意味着,如果URL中有汉字,就必须escape(),encodeURI(),encodeURIComponent()编码后使用。
Get或Post方法发出HTTP请求中包含中文,此时的编码方法是由网页HTML源码中的字符集决定的。
<meta charset="UTF-8">
以“春节”为例:如果是GB2312编码,生成的是%B4%BA%BD%DA。如果是UTF-8编码,生成的是%E6%98%A5%E8%8A%82。
Ajax中的URL包含中文,在这种情况下,IE和Firefox的处理方式完全不一样。IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。
escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如"春节"的返回结果是%u6625%u8282,,escape()不对"+"编码,主要用于汉字编码,现在已经不提倡使用。
encodeURI()是Javascript中真正用来对URL编码的函数。 编码整个url地址,但对特殊含义的符号"; / ? : @ & = + $ , #"也不进行编码。对应的解码函数是:decodeURI()。
encodeURIComponent() 能编码"; / ? : @ & = + $ , #"这些特殊字符。对应的解码函数是decodeURIComponent(),假如要传递带&符号的网址,所以用encodeURIComponent()。