前言

JavaScript中有三个可以对字符串编码的函数,分别是:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 。


escape()和它们不是同一类

简单来说,escape()是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。 其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。

escape('编码')  //"%u7F16%u7801"
unescape('%u7F16%u7801') //"编码"

最常用的encodeURI()和encodeURIComponent()

对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中:
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&()=:/,;?+’
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!
()’
所以encodeURIComponent比encodeURI编码的范围更大。

实际例子来说,encodeURIComponent会把http://  编码成  http%3A%2F%2F 而encodeURI却不会。

encodeURI('https://www.baidu.com/') //"https://www.baidu.com/"

encodeURIComponent('https://www.baidu.com/') //"https%3A%2F%2Fwww.baidu.com%2F"

最重要的,我该什么场合用什么方法

区别上面说的很清楚了,接下来从实际例子来说说把。
1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。
3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。

var a = "&test=测试"

escape(a)
//"go%26test%3D%u6D4B%u8BD5"
unescape("test%3D%u6D4B%u8BD5")
//"http:/go&test=测试"

encodeURI(a)
//"htlogo&test=%E6%B5%8B%E8%AF%95"
decodeURI(ogo&test=%E6%B5%8B%E8%AF%95")
//"http:olbar_logo&test=测试"


encodeURIComponent(a)
//"http%3A%2F%2Fblog.csdn.net%2F%3Fref%3Dtoolbar_logo%26test%3D%E6%B5%8B%E8%AF%95"
decodeURIComponent("http%3A%2F%2Fblog.csdn.net%2F%3Fref%3Dtoolbar_logo%26test%3D%E6%B5%8B%E8%AF%95")
//&test=测试"