Js中对字符串编码的函数

js中有三个能对字符串进行编码的函数,他们分别是: escape(), encodeURI() 以及 encodeURIComponent();当然肯定还会有对应的解码的函数:unescape(), decodeURI() 以及 decodeURIComponent()。

但是有个问题就是他们之间到底有什么区别?他们各自的应用场景是什么样的?倍感迷惑!!

首先还是来翻下ecma的标准,在Ecma-262中,第 15.1.3 章节中有说:

encodeURIdecodeURI函数的目的就是处理完整的URI的;他们假定在URI中的任何的保留字符都有特殊的意义,所以不会被编码。

encodeURIComponentdecodeURIComponent函数的目的就是处理URI的单个的组件部分;他们假定的任何的保留字符都代表的是文本,因此他们必须被编码,这样当这个组件是一个完整的URI的部分的时候他们不会以保留字符来解析。

保留字符:; / ? : @ & = + $ ,

不编码的:26个英文大小写字母、十进制数字以及符号- _ . ! ~ * ' ( )

所以结果就是:

  • encodeURI是应用到针对于处理整个URI的情况下的,他们不会编码:26个英文大小写字母、十进制数字以及符号- _ . ! ~ * ' ( );同时也不会对保留字符:; / ? : @ & = + $ ,进行编码,需要注意的是也不会对#进行编码,虽然他不是保留字符。

  • encodeURIComponent就是应用到针对于处理一个完整URI中的一部分组件的情况下,他们不会编码:26个英文大小写字母、十进制数字以及符号- _ . ! ~ * ' ( );但会对保留字符:; / ? : @ & = + $ ,进行编码,同样也会对#编码。

上面的仅仅是关于encodeURIencodeURIComponent的介绍,下边就看下escape

escape函数就是将字符串中某些字符替换为十六进制转义序列之后的值。

解释下某些字符:如果其字符码值char code小于256且不是该字符不是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./中的任何一个;或者该字符码值大于等于256的字符。

对于字符码值char code小于256且不是该字符不是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./中的任何一个,他们的替换值就是%xy样子的,其中xy是编码该字符的两个的十六进制数字;而对于码值大于等于256的字符来说,他们的替换值就是%uwxyz这样子的,其中wxyz就是编码该字符的四个十六进制数字。

总结

所以说,如果你是处理URI的话,就用encodeURI(处理完整URI)或encodeURIComponent(处理URI的单个的组件部分),如果不是,那么用escape就可以了。

发布于: 2014年 09月 03日