在JS中,escape,URLEncode与encodeURIComponent都是编码方法,一般用于对URL进行编码
为什么要使用编码方法
网络标准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标准的字符,这个时候,浏览器就会对这个字符进行编码,从而让其符合RFC 1738标准的规定。但是,RFC 1738标准并没有规定使用何种编码方式去进行统一的编码,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。
如下所示:
URL提交方式 | 编码方式 |
网址路径中包含中文 | utf-8编码 |
查询字符串中包含中文 | 操作系统的默认编码 |
Get Post 方法社团改昵称的URL包含中文 | 网页的编码 |
Ajax的URL中包含中文 | IE:GB2312编码(操作系统的默认编码), Firefox:utf-8 |
面对如此多的情况,如果采用浏览器默认的方法进行编码,那么我们在接收的时候,就要考虑很多种情况,这明显是不太明智的。
有什么方法可以避免浏览器自身来处理编码呢?方法就是,在提交前使用代码手动将url转化为符合标准的格式,这也是以下三个方法出现的原因:
escape
escape()是一种编码方法, 可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
注意事项:
1.该方法不会对 ASCII 字母和数字进行编码,
2.不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。
3.除此之外,其他所有的字符都会被转义序列替换。
4.ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。
5.在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式
6.escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值
7.escape()不对“+”编码,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格
对应的解码方法:unescape()
URLEncode
1.encodeURI()是Javascript中真正用来对URL编码的函数。
2.它着眼于对整个URL进行编码
3.除了常见的符号以外,对其他一些在网址中有特殊含义的符号“; / ? : @ & = + $ , #”,也不进行编码
4.编码后,它输出符号的utf-8形式,并且在每个字节前加上%
5.不对单引号'编码
对应的解码函数是decodeURI()
encodeURIComponent
1.URL的组成部分进行个别编码,而encodeURI()整个URL进行编码
2.“; / ? : @ & = + $ , #”,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码
3.对应的解码函数是decodeURIComponent()
三者间的区别联系
编码方法 | 解码方法 | 主要用途 | 不进行处理的字符 | 注意事项 | 备注 |
escape() | unescape() | escape()不能直接用于URL编码, 它的真正作用是返回一个字符的Unicode编码值 | * @ - _ + . / 。 | 1.该方法不会对 ASCII 字母和数字进行编码 2.ECMAScript v3 反对使用该方法 3.在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式 4..escape()不对“+”编码,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格 | 已经不提倡使用 |
encodeURI() | decodeURI() | 对整个URL进行编码 | ; / ? : @ & = + $ , #'' | 不对单引号'编码 | |
encodeURIComponent() | decodeURIComponent() | 对URL的组成部分进行个别编码,而不用于对整个URL进行编码 | 推荐使用 |