比较escape、encodeURI、encodeURIComponent

估计很多前端工程师并不清楚escape,encodeURI, encodeURIComponent的区别,也不知道什么时候该用哪个方法,以及这些方法为什么要被用到,下面我主要来阐述一下这三个方法的区别以及用法。 
escape 方法: 

引用
MSDN JScript: 
The escape method returns a string value (in Unicode format) that contains the contents of [the argument]. All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding, where xx is equivalent to the hexadecimal number representing the character. For example, a space is returned as "%20."


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

引用
Mozilla Developer Core Javascript Guide 的描述 
The escape and unescape functions let you encode and decode strings. The escape function returns the hexadecimal encoding of an argument in the ISO Latin character set. The unescape function returns the ASCII string for the specified hexadecimal encoding value.


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

Javascript代码   收藏代码
  1. escape('~!@#$%^&*(){}[]=:/,;?+\'"\\')  
  2. //%7E%21@%23%24%25%5E%26*%28%29%7B%7D%5B%5D%3D%3A/%2C%3B%3F+%27%22%5C  


encode 方法: 

引用
MSDN JScript: 
The encodeURI method returns an encoded URI. If you pass the result to decodeURI, the original string is returned. The encodeURI method does not encode the following characters: ":", "/", ";", and "?". Use encodeURIComponent to encode these characters.


encodeURI 方法返回一个编码的 URI, encodeURI 不对以下字符编码: 
":", "/", ";", and "?" 而可以用encodeURIComponent对这些字符编码 
下面说的更详细一些 

引用
Mozilla Developer Core Javascript Guide: 
Encodes a Uniform Resource Identifier (URI) by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character.



通过替换每一个字符实例成一个或是两三个编码过的UTF-8字符,来对URI编码。 
例子: 

Javascript代码   收藏代码
  1. encodeURI('~!@#$%^&*(){}[]=:/,;?+\'"\\')  
  2. //~!@#$%25%5E&*()%7B%7D%5B%5D=:/,;?+'%22%5C  


encodeURIComponent 方法: 

引用
MSDN JScript Reference: 
The encodeURIComponent method returns an encoded URI. If you pass the result to decodeURIComponent, the original string is returned. Because the encodeURIComponent method encodes all characters, be careful if the string represents a path such as /folder1/folder2/default.html. The slash characters will be encoded and will not be valid if sent as a request to a web server. Use the encodeURI method if the string contains more than a single URI component.


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

引用
Mozilla Developer Core Javascript Guide: 
Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character.


这个解释和encode一样,实际上encodeURI 和 encodeURIComponent 差别就是一个是对更多的字符编码,而一个只是对URI部分编码。 
同样字符串的例子: 

Java代码   收藏代码
  1. escape('~!@#$%^&*(){}[]=:/,;?+\'"\\')  
  2. //%7E%21@%23%24%25%5E%26*%28%29%7B%7D%5B%5D%3D%3A/%2C%3B%3F+%27%22%5C  
  3. encodeURI('~!@#$%^&*(){}[]=:/,;?+\'"\\');  
  4. //~!@#$%25%5E&*()%7B%7D%5B%5D=:/,;?+'%22%5C  
  5. encodeURIComponent('~!@#$%^&*(){}[]=:/,;?+\'"\\');  
  6. //~!%40%23%24%25%5E%26*()%7B%7D%5B%5D%3D%3A%2F%2C%3B%3F%2B'%22%5C  


总结: 
该怎么使用呢? 

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。 
此文章是翻译而来 

原文:http://xkr.us/articles/javascript/encode-compare/ 
关于URL,URI不太明白的同学可以看看 http://www.ibm.com/developerworks/cn/xml/x-urlni.html 
这篇文章 

你可能感兴趣的:(比较escape、encodeURI、encodeURIComponent)