escape、encodeURI和encodeURIComponent的区别

最近在项目中用到对一段url进行编码,因此整理如下:

javascript中对文字的编码有3组函数:

escape()

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

1
2
console.log(escape("Visit W3School!") + "<br />"); //Visit%20W3School%21
console.log(escape("?!=()#%&")); //%3F%21%3D%28%29%23%25%26

结论:js使用数据时可以使用escape

encodeURI()

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )

该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#

1
2
3
console.log(encodeURI("http://www.w3school.com.cn")+ "<br />"); //http://www.w3school.com.cn
console.log(encodeURI("http://www.w3school.com.cn/My first/")); //http://www.w3school.com.cn/My%20first/
console.log(encodeURI(",/?:@&=+$#")); //,/?:@&=+$#

结论:进行url跳转时可以整体使用encodeURI

encodeURIComponent()

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )

其他字符(比如:;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。

1
2
3
console.log(encodeURIComponent("http://www.w3school.com.cn")); //http%3A%2F%2Fwww.w3school.com.cn
console.log(encodeURIComponent("http://www.w3school.com.cn/p 1/")); //http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
console.log(encodeURIComponent(",/?:@&=+$#")); //%2C%2F%3F%3A%40%26%3D%2B%24%23

结论:传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。

综合结论

  • escape()除了ASCII字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法。
  • encodeURI()用于编码整个URI,因为URI中的合法字符都不会被编码转换。
  • encodeURIComponent()方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2019 FE blog All Rights Reserved.

访客数 : | 访问量 :