为什么编码
一切源于ASCII字符集
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,这被称为 ASCII 码,一直沿用至今。
书写URI
时使用的是ASCII
字符集,它是一种单字节字符的编码方案,一共收录了128个字符,用一个字节就可以存储,比如字符a
用二进制就可以表示为01100001
。128个并不多,英语用128个符号编码是够了,但是用来表示其他语言,128个符号是不够的,因此URI
中不可避免地会包含非ASCII
字符集中的字符。
那非ASCII
字符集中的字符会对URI
有什么影响呢?
一个字符可以表示的范围是0~255,其中ASCII
可表示的范围是0~127,超过ASCII
范围的128~255之间的值是不可见字符。当字符在网络上传输时,会经过多个路由设备,不同的设备对字符的处理方式不同,可见的字符通常都能被正确处理,但不可见的字符就有可能会被处理错误。
为了确保数据能够可靠传输,要对这些不可见的字符进行处理,我们可以在数据发送方先将原始数据编码,将可见的和不可见的字符都编码成可见字符,也就是ASCII
可表示的可见字符,当数据到达接收方时,再对编码的数据进行解码操作,得到原始数据,所以如果URI
中含有非ASCII
字符集中的字符,就要对其编码。
保留字符和不安全字符
除此之外,还需要对URI
中的保留(reserved)字符和不安全(unsafe)字符进行编码。
所谓保留字符就是那些在URI
中具有特定意义的字符,不安全字符是指那些在URI
中没有特殊含义,但在URI
所在的上下文中可能具有特殊意义的字符,比如双引号(“”
)。
下图是一些保留字符和不安全字符示例:
编码规范(俗称百分号编码)
编码时,使用的是%编码
规范。具体说明如下:
- 对
URI
中的非保留字符和非不安全字符不进行编码。 - 对
URI
中的保留字符和不安全字符,需要取其ASCII
内码,然后加上%
前缀,将该字符进行编码。 - 对
URI
中的非ASCII
字符,需要取其Unicode
内码,然后加上%
前缀,将该字符进行编码。
如何进行编码操作
上面介绍了理论和原因,务完虚下面就该务实了。来,上点儿干货。
首先,有编码就得有解码,它们是一对的。其次,在js中有两套解决方案,分别是:
encodeURI()
和decodeURI()
encodeURIComponent()
和decodeURIComponent()
这两套方案的相同点是:
- 对
URI
中的非保留字符和非不安全字符不进行编码,原先是啥样,编码后还是啥样。 - 对
URI
中的非ASCII
字符,一定要进行编码转换。
这两套方案的差异点是:对URI
中的保留字符和不安全字符要不要编码?
encodeURI()
和decodeURI()
不对保留字符和不安全字符编码。encodeURIComponent()
和decodeURIComponent()
要对保留字符和不安全字符编码。
在《一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别》这篇文章中,有张图,介绍的很清楚:
-- 完 --
参考资料:《一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。