日期:2014-05-16  浏览次数:20372 次

JavaScript编码解码详细介绍

来自: http://www.weakweb.com

原文:http://www.weakweb.com/articles/226.html

1. escape()

escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码+/-*_.@。其他所有的字符都会被转义序列替换。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。而对于0-255以外的unicode值进行编码时输出%u****格式,例如”我”编码后的值为%u6211。

2. encodeURI()

encodeURI() 函数可把字符串作为 URI 进行编码,其中的某些字符将被十六进制的转义序列进行替换。该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码+/-*_.!~@’();/?:&=$,#。该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#

3. encodeURIComponent()

encodeURIComponent() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码-*_.!~’()。

总结:

1. escape()对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent如果对特殊字符编码则结果相同,结果相同是指字符同时在这三个函数的编码范围内时,比如空格,对于/等不是三个函数同时处理则没有比较意义。

2. escape()是一个古老的函数,所以尽量不要使用。当对URI进行编码时,因为escape会对URI中常见字符进行编码,比如/?等,所以对URI进行编码时应该选择encodeURI(),而当对用户提交的表单字段进行编码时,我们知道,在用户提交的表单字段中,如果有空格,则会被转化为+字符,而服务器解析的时候则会认为+号代表空格。但escape()不会对’+'进行编码,所以这时应该选择encodeURIComponent()。

3. 因为encodeURI()不对URL中常见的字符进行编码:;/?:@&=+$,#,而escape()和encodeURIComponent()会对这些特殊字符编码,所以当对URI进行编码时应该选择encodeURI()。

4. encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的。因为如果参数中包含了?&等特殊字符的话,encodeURI是不会对它们进行编码的,这样可能就造成解析请求参数的错误,不用escape()的原因见总结的第一条。

5. 三个函数对应的解码函数分别是unescape(), decodeURI(), decodeURIComponent()。

6. 很多时候浏览器会自动对数据进行编码,比如URL,因此在传输数据前最好先进行编码,接收后再用对应的解码函数进行解码,这样可以有效的保证数据的一致性。