Js中对字符串编码的函数
js中有三个能对字符串进行编码的函数,他们分别是: escape(), encodeURI() 以及 encodeURIComponent();当然肯定还会有对应的解码的函数:unescape(), decodeURI() 以及 decodeURIComponent()。
但是有个问题就是他们之间到底有什么区别?他们各自的应用场景是什么样的?倍感迷惑!!
首先还是来翻下ecma的标准,在Ecma-262中,第 15.1.3 章节中有说:
encodeURI和decodeURI函数的目的就是处理完整的URI的;他们假定在URI中的任何的保留字符都有特殊的意义,所以不会被编码。
encodeURIComponent和decodeURIComponent函数的目的就是处理URI的单个的组件部分;他们假定的任何的保留字符都代表的是文本,因此他们必须被编码,这样当这个组件是一个完整的URI的部分的时候他们不会以保留字符来解析。
保留字符:; / ? : @ & = + $ ,
不编码的:26个英文大小写字母、十进制数字以及符号- _ . ! ~ * ' ( )
所以结果就是:
- 
    encodeURI是应用到针对于处理整个URI的情况下的,他们不会编码:26个英文大小写字母、十进制数字以及符号-_.!~*'();同时也不会对保留字符:;/?:@&=+$,进行编码,需要注意的是也不会对#进行编码,虽然他不是保留字符。
- 
    encodeURIComponent就是应用到针对于处理一个完整URI中的一部分组件的情况下,他们不会编码:26个英文大小写字母、十进制数字以及符号-_.!~*'();但会对保留字符:;/?:@&=+$,进行编码,同样也会对#编码。
上面的仅仅是关于encodeURI和encodeURIComponent的介绍,下边就看下escape:
escape函数就是将字符串中某些字符替换为十六进制转义序列之后的值。
解释下某些字符:如果其字符码值char code小于256且不是该字符不是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./中的任何一个;或者该字符码值大于等于256的字符。
对于字符码值char code小于256且不是该字符不是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./中的任何一个,他们的替换值就是%xy样子的,其中xy是编码该字符的两个的十六进制数字;而对于码值大于等于256的字符来说,他们的替换值就是%uwxyz这样子的,其中wxyz就是编码该字符的四个十六进制数字。
总结
所以说,如果你是处理URI的话,就用encodeURI(处理完整URI)或encodeURIComponent(处理URI的单个的组件部分),如果不是,那么用escape就可以了。
