关于escape(), encodeURI()和encodeURIComponent()编码的区别

escape(),encodeURI() 和 encodeURIComponent() 编码函数是JavaScript编程中非常常用的几个函数,它们对应的解码函数分别是unescape(),decodeURL()和decodeURIComponent(),这里简单地归纳下几个函数的使用要点:
一,escape()函数是JavaScript1.0引入的函数,它的功能是在ISO Latin字符集(是unicode字符集的一个子集,因此也就是unicode字符集)内进行编码,所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码,如果是大于255,则需要两个字节进行表示的时候,则转换成%uxxxx的格式(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反,中文‘我’对应的编码是%u6211。不会被此方法编码的字符: @ * / +。

二,encodeURI()把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
三,encodeURIComponent()把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) 。

     综上可以看出,三个编码函数使用的字符集均是unicode的,但对应的字符编码方式有所不同,escape只是简单的编码成16进制而言,而后面的两个函数则是按照utf-8进行编码,不同的只是需要编码的字符数目有所不同而已,下面写个测试代码:
var a = escape('我');  
var b = encodeURI('我');  
var c = encodeURIComponent('我');  
alert(a+'|'+b+'|'+c);  


执行后输出:%u6211|%E6%88%91|%E6%88%91

可以看出:
escape把中文的‘我’编码成%u6211的格式,对应的在unicode字符集的编码的值是25105,这里说明escape编码只是把字符的unicode编码简单地用16进制进行表示而已。
而encodeURI和encodeURIComponent则用utf-8的编码方式进行编码,现在被编码成三个字节,我们把各自对应的%去掉后变成:
E68891,然后我们进一步的写成二进制的格式:1110 0110 1000 1000 1001 0001,然后按照utf-8编码的规则,去掉第一个字节的
1110,第二个字节的10和第三个字节的10后变成:0110 00 1000 01 0001,写成十六进制的格式:6211,恰好对应unicode的编码值6211。

因此从上面可以看出,这三个函数使用的字符集均是unicode,不同的只是escape直接对unicode编码成16进制,而encodeURI和encodeURIComponent则是把unicode编码成utf-8而已。

猜你喜欢

转载自liaozh.iteye.com/blog/2299327
今日推荐