前端js的三种解码方式

JavaScript026

前端js的三种解码方式,第1张

** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不经过编码直接用于 URL。

***例如:搜索的中文关键字,复制网址之后再粘贴就会发现该URL已经被转码。

1) escape 和 unescape

原理:对除ASCII字母、数字、标点符号 @ * _ + - . / 以外的其他字符进行编码。

编码:

eg:escape('http://www.baidu.com?name=zhang@xiao@jie&order= 你好')

res:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D%u4F60%u597D"

解码:

eg:unescape("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D%u4F60%u597D")

res:" http://www.baidu.com?name=zhang@xiao@jie&order= 你好"

2) encodeURI 和 decodeURI

原理:返回编码为有效的统一资源标识符 (URI) 的字符串,不会被编码的字符:! @ # $ &* ( ) = : / ? + '

encodeURI()是Javascript中真正用来对URL编码的函数。

编码:

eg:encodeURI('http://www.baidu.com?name=zhang@xiao@jie&order= 你好')

  res:" http://www.baidu.com?name=zhang@xiao@jie&order=%E4%BD%A0%E5%A5%BD "

解码:

eg:decodeURI(" http://www.baidu.com?name=zhang@xiao@jie&order=%E4%BD%A0%E5%A5%BD ")

  res:" http://www.baidu.com?name=zhang@xiao@jie&order= 你好"

3) encodeURIComponent 和 decodeURIComponent

原理:对URL的组成部分进行个别编码,而不用于对整个URL进行编码

编码:

eg:encodeURIComponent('http://www.baidu.com?name=zhang@xiao@jie&order=1')

res:"http%3A%2F% 2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1 "

解码:

eg:decodeURIComponent("http%3A%2F% 2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1 ")

res:" http://www.baidu.com?name=zhang@xiao@jie&order=1 "

Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。

实际上,escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如"春节"的返回结果是%u6625%u8282,也就是说在Unicode字符集中,"春"是第6625个(十六进制)字符,"节"是第8282个(十六进制)字符。

它的具体规则是,除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码。在u0000到u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。对应的解码函数是unescape()。

还有两个地方需要注意。

首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。这一点对下面两个函数也适用。

其次,escape()不对"+"编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。

例如:

编码:

解码:

encodeURI()是Javascript中真正用来对URL编码的函数。

它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"/ ? : @ &= + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。

它对应的解码函数是decodeURI()。

例如:

编码:

解码:

最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。

因此,"/ ? : @ &= + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。

它对应的解码函数是decodeURIComponent()。

例如:

编码:

解码:

参考文章:阮一峰:关于URL编码

这个暂时解释不了。你知道blob是怎么生成出来的就知道为什么我会这么说了。

有人拿到b站的地址也是在中间生成blob的过程里,而不是生成blob后,去反向算出来。

这个真实地址都是在js里面。