比较escape(),encodeURI(),和encodeURIComponent(),转载

最近遇到转码的问题,escape(),encodeURI(), encodeURIComponent()都可以进行转码,但是却有一些差别。

escape 方法:

escape 方法返回一个包含参数内容的UNICODE格式的字符串值。所有的“空格”、“标点”、“重音字符”以及任何非ASCII字符都会被替换为带着%xx 编码,这里的xx是一个表示原来字符的16进制数字。例如一个空格会被替换为%20

escape 和 unescape 方法让你可以对字符串编码和解码。 escape 调用方法将返回对ISO拉丁字符参数的16进制编码,而 unescape 方法会为指定的16进制编码返回ASCII 字符。
看看例子吧

encode 方法:

encodeURI 方法返回一个编码的 URI, encodeURI 不对以下字符编码:
“:”, “/“, “;”, and “?” 而可以用encodeURIComponent对这些字符编码

encodeURIComponent 方法:

encodeURIComponent会对更多的字符进行编码,包括表示路径的”/“,所以当使用时,需要谨慎

实际上encodeURI 和 encodeURIComponent 差别就是一个是对更多的字符编码,而一个只是对URI部分编码。

总结:
该怎么使用呢?

escape:
escape 不会编码的字符:@*/+
escape方法不回编码+字符,+字符在服务器端会被解释成空格,这点和通过表达提交一样。
由于escape有这样的缺点,和它不能很好的正确处理非ASCII字符的事实,我们应该尽量避免(对URI)使用escape,最好的方式是encodeURIComponent。

encodeURI:
encodeURI 不会编码的字符很多,有:~!@#$&*()=:/,;?+’
在对一段URI编码来说,encodeURI方法比escape方法更专业一些。当你需要编码一整个URI的时候,你可以使用此方法,因为URI中的合法字符都不会被编码转换。需要注意到是字符’也是URI中的合法字符,所以也不会被编码转换。

encodeURIComponent:
encodeURIComponent不会编码的字符: ~!*()’
encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的。需要注意到是字符’也是URI中的合法字符,所以也不会被编码转换。

其实前端最常用的是encodeURIComponent,因为这个方法会把URI中的queryString中的非法字符编码,这样通过get请求向服务器端传递参数的时候不会出错。
escape 在后端和前端的接口规约里常常会碰到,但是一般不需要前端在本地escape,一般是后端接口吐出 escape后的数据,前端unescape。

说那么多全是屁话,encodeURI是做整段URL的编码,encodeURIComponent是做URL片段的编码(URL拼凑)

转自:
http://qbaty.iteye.com/blog/1140870
http://xkr.us/articles/javascript/encode-compare/