Web---URI的编码

为什么编码

一切源于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所在的上下文中可能具有特殊意义的字符,比如双引号(“”)。

下图是一些保留字符和不安全字符示例:

Web---URI的编码_第1张图片

编码规范(俗称百分号编码)

编码时,使用的是%编码规范。具体说明如下:

  • URI中的非保留字符和非不安全字符不进行编码。
  • URI中的保留字符和不安全字符,需要取其ASCII内码,然后加上%前缀,将该字符进行编码。
  • URI中的非ASCII字符,需要取其Unicode内码,然后加上%前缀,将该字符进行编码。

如何进行编码操作

上面介绍了理论和原因,务完虚下面就该务实了。来,上点儿干货。

首先,有编码就得有解码,它们是一对的。其次,在js中有两套解决方案,分别是:

  • encodeURI()decodeURI()
  • encodeURIComponent()decodeURIComponent()

这两套方案的相同点是:

  • URI中的非保留字符和非不安全字符不进行编码,原先是啥样,编码后还是啥样。
  • URI中的非ASCII字符,一定要进行编码转换。

这两套方案的差异点是:URI中的保留字符和不安全字符要不要编码?

  • encodeURI()decodeURI()不对保留字符和不安全字符编码。
  • encodeURIComponent()decodeURIComponent()要对保留字符和不安全字符编码。

《一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别》这篇文章中,有张图,介绍的很清楚:

Web---URI的编码_第2张图片

-- 完 --


参考资料:《一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别》

你可能感兴趣的:(http)