js 编码解码 encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,escape,unescape区别

1.概念理解

1.encodeURI,encodeURIComponent是对字符进行编码(它们是一对)。
2.decodeURI,decodeURIComponent是对编码过的字符进行解码(它们是一对)。
3.encodeURI,encodeURIComponent不会对 ASCII 字母和数字进行编码和解码,也不会对这些 ASCII 标点符号进行编码和解码,比如(!,",#,$,%,&,’,(),*,+,-,/,:,;,@,<,>,=,等…)。
4.encodeURIComponent,decodeURIComponent可以编码和解码除了非转字符和十进制数字的其他所有字符进行编码解码。

2.用法

平时我们用的最多的就是对url地址进行编码,一个url可能会包含5中类型:
1.上面说额保留字(; , / ,逗号,?,:,&,@,=,+,$,)
2.非转义字符(52个字母=26个大小写英文字母),十进制数字,还有标记符( - ,_, .,! ,~ ,* ,’, ( )),这种字符上面4种都编码和解码不了。
3.#,它不会被编码,不属于保留字也不属性非转义字符
4.上面没有说到的字符,encodeURI只能编码这种,decodeURI也只能解码这种
5.被转义成为十六进制的字符(0-9对应0-9;A-F对应10-15)

下面我拿个例子来说吧,就比如我现在这篇博客的地址 : “https://mp.csdn.net/mdeditor/102756956”,哎呀都是非转义字符。还是改下吧 " https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1# ",

		var a ="https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1";
		var b = encodeURI(a);
		var c = encodeURIComponent(a);
		console.log(b);//https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1
	console.log(c);//https%3A%2F%2Fmp.csdn.net%2Fmdeditor%2F102756956%3FpropertyModelId%3D1854008%26%26a%3D1
		var b1 = decodeURI(b);
		var c1= decodeURIComponent(c);
		console.log(b1,c1);//https://mp.csdn.net/mdeditor/102756956?propertyModelId=1854008&&a=1

这里需要注意的是decodeURIComponent能够解码encodeURI编码的字符,而decodeURI不能解码encodeURIComponent编码的字符。所以最好不要搞混了,什么编码就用什么解码,下面我们来分析下地址的字符:
1.https,mp,csdn,net,mdeditor,propertyModelId,a为非转义字符
2.102756956,1854008,1为十进制数字
3.地址中间的点为标记符
4.:,/,?,=,&为保留字
所以encodeURIComponent除非了上述的第2点不能编码外,其他都能编码,decodeURIComponent解码也是一样,传递参数时需要使用encodeURIComponent,这样组合的url才不会被特殊字符截断,实际项目中我们一般需要get请求的方式在地址栏中拼接一些参数,但是参数中如果出现保留字或者# 这样字符,就必须要用decodeURIComponent了,不然这些特殊字符会导致我们接收参数的错误。

3.尽量避免使用escape和unescape方法(请勿unescape用于解码URI)

尽管 unescape() 未严格弃用(如“从Web标准中删除”),但它 在ECMA-262标准的附件B中定义 ,其介绍指出:本附件中指定的所有语言功能和行为都具有一个或多个不良特征,如果没有遗留用法,则将从本规范中删除。在编写新的ECMAScript代码时,程序员不应使用或假定这些功能和行为的存在。
其实escape类似encodeURI,unescape类似decodeURI,这里就不多说了。

结论:encodeURIComponent编码和decodeURIComponent解码用的比较多,url带有中文或者特殊字符的时候进行编码,可以防止乱码,实际项目中我们一般需要get请求的方式在地址栏中拼接一些参数,但是参数中如果出现保留字或者#这些特殊字符,就必须要用decodeURIComponent了,不然这些特殊字符会导致我们接收参数的错误。

好了说到这里都已经说的差不多了,有不正的地方请指正,不胜感激!!欢乐的时光总是过得特别快,又到时候和大家讲拜拜!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值