【深入 Base64】Javascript 中 escape、encodeURI 和 encodeURIComponent(三)

我可以很负责任地说,基本上大部分的前端童鞋都不知道这三个是 什么关系。。。与这三个对应的还有 unescape、decodeURI、decodeURIComponent。是不是已经不清楚了?很正常,就连知乎上面都是一堆错误的答案。

escape、unescape

首先这两个方法已经从 web 标准中删除了,请大家以后尽量不要再使用了。

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

因为 Javascript 使用的是 unicode 字符集,所以当字符的 16 进制格式值小于等于 0xFF 时,用一个 2 位转移序列“%xx”表示;大于的话则使用 4 位序列“%uxxxx”表示。escape 和 unescape 就是编码和反编码。

encodeURI、encodeURIComponent、decodeURI 和 decodeURIComponent

这四个方法从名字就能知道是针对 URI 的:

  • encodeURI()、encodeURIComponent() 是对统一资源标识符(URI)进行编码的方法。它使用 1 到 4 个转义序列来表示每个字符的 UTF-8 编码(只有由两个代理字符区组成的字符才用四个转义字符编码)。encodeURI() 和 encodeURIComponent() 的唯一区别就是 encodeURI() 不会对 “; , / ? : @ & = + $”这些对 URI 有意义的保留字符进行 转义。
  • decodeURI()、decodeURIComponent() 就是对上面方法编码的字符串进行解码。

从上面的说明中,我们可以得知一个重要的信息,那就是 encodeURI 和 encodeURIComponent 编码是 UTF-8 编码!