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
就可以了。