前言
URL的合法字符表示再浏览器的地址栏中不会被转义的字符,有两种:
#1. URL元字符:分号(;),逗号(’,’),斜杠(/),问号(?),冒号(:),at(@),&,等号(=),加号(+),美元符号($),井号(#)
#2. 语义字符:a-z,A-Z,0-9,连词号(-),下划线(_),点(.),感叹号(!),波浪线(~),星号(*),单引号(),圆括号(())
当输入的字符不符合以上的字符时,浏览器就会把该字符转义.
转义规则: 根据操作系统的默认编码,将每个字节转为百分号(%)加上两个大写的十六进制字母。
比如: 当再浏览器地址栏中输入 www.baidu.com/q=你好
时,会被转义成例如 www.baidu.com/q=%E6%98%A5%E8%8A%82
类似的字符串,浏览器才会读取。
1. encodeURI
定义和用法
encodeURI() 函数可把字符串作为 URI 进行编码。
说明:
该方法不会对ASCII
字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ‘ ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
示例1
2> encodeURI("http://www.baidu.com:8080:public/a=小玉&b=<>")
> http://www.baidu.com:8080:public/a=%E5%B0%8F%E7%8E%89&b=%3C%3E
2. encodeURIComponent
定义和用法
和encodeURI一样,encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ‘ ( ) 。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
示例1
2> encodeURI("http://www.baidu.com:8080:public/a=小玉&b=<>")
> http%3A%2F%2Fwww.baidu.com%3A8080%3Apublic%2Fa%3D%E5%B0%8F%E7%8E%89%26b%3D%3C%3E
3. decodeURI
定义和用法
顾名思义,decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。
示例1
2> decodeURI("http://www.baidu.com:8080:public/a=%E5%B0%8F%E7%8E%89&b=%3C%3E")
> http://www.baidu.com:8080:public/a=小玉&b=<>
4. decodeURIComponent
定义和用法
顾名思义,decodeURIComponent() 函数可对 encodeURIComponent() 函数编码过的 URI 进行解码。
示例1
2> decodeURI("http%3A%2F%2Fwww.baidu.com%3A8080%3Apublic%2Fa%3D%E5%B0%8F%E7%8E%89%26b%3D%3C%3E")
> http://www.baidu.com:8080:public/a=小玉&b=<>
5. escape
定义和用法
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
说明
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
示例1
2> escape("*123小玉@#$()8")
> *123%u5C0F%u7389@%23%24%28%298
6. unescape
定义和用法
unescape() 函数可对通过 escape() 编码的字符串进行解码。
说明
该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。
示例1
2> escape("*123%u5C0F%u7389@%23%24%28%298")
> *123小玉@#$()8"
提示和注释
ECMAScript v3 并反对使用unescape
和escape
,因此应该用 decodeURI()
或ecodeURI()
和 decodeURIComponent()
或ecodeURIComponent()
取而代之。
参考文章
#1. 本文参照w3c
;
#2. 前端编码解码