问题的起源
在这里先思考一个问题,URL是能乱写的吗?如果不能,那么URL该写成什么样呢?
RFC 1738规定URL必须只能使用英文字母,阿拉伯数字和某些标点符号”
$-_.+!*'(),
“[不包括双引号]
,不能使用其他文字和符号。
这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致"URL编码"成为了一个混乱的领域。
具体而言就是在不同的浏览器,不同的操作系统有很大可能采用完全不一样的编码规则。
比如: 在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。
解决方案
那么有没有统一的编码规则对于程序员来说简直就是一个噩梦。那么有没有一种方法能够保证客户端只用一种编码方法向服务器发出请求?
答案肯定是有的。那就是通过JavaScript先对URL进行编码,然后再向服务器提交,不要给浏览器擦手的机会。
escape
escape函数是最古老的用于编码的函数,现在以及不推荐使用了。
escape实际上不能直接用于URL编码,它真正的作用是返回一个字符的Unicode编码值。
编码规则:
- 除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码。
- 在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。
encodeURL
encodeURI()是Javascript中真正用来对URL编码的函数。
它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
encodeURIComponent
最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。