浅谈JS中的escape,URLEncode与encodeURIComponent

在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进行编码  推荐使用

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值