js中如何对url进行编码和解码

发布时间:

这篇文章主要介绍了js中如何对url进行编码和解码问题,具有很好的参考价值,希望对大家有所帮助。

js中如何对url进行编码和解码

js 对url进行编码和解码

三种编码和解码函数

encodeURI和 decodeURI

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

需要注意的是,它不对单引号’编码。

encodeURIComponent和decodeURIComponent(推荐使用)

它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。

因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码

escape 和 unescape

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

js url二次编码和解码

问题

今天遇到了一个奇怪的问题:在JS中用decodeURI()解析完一串URL编码后发现它依旧是URL编码,看的我一脸懵逼!最后发现参数里面竟然是一个URL二次编码!

类似下面这种形式:

"%25E6%2588%2591%25E7%2588%25B1%25E4%25BD%25A0"

也就是说也解码两次才能得到原码,如下:

//编码结果:%25E6%2588%2591%25E7%2588%25B1%25E4%25BD%25A0
encodeURI(encodeURI('我爱你'))
//解码结果:我爱你
decodeURI(decodeURI("%25E6%2588%2591%25E7%2588%25B1%25E4%25BD%25A0"))

URL编码解码原理

URL编码原理:

这个百度百科上解释的就很好:URL编码就是一个字符ASCII码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如:“\”,它的ASCII码是92,92的十六进制是5c,所以“\”的URL编码就是%5c。

URL二次编码会对生成的编码再做一次编码,还拿“\”为例,一次编码后是“%5c”,再对“%5c”进行编码得到:“%255c”。

二次编码其实就是对%做了编码,后面的字母和数字没变,“%”的URL编码是“%25”,所以二次编码全都是已%25开头的。

注意:encodeURI()仅会将特殊字符转化成URL编码形式,特殊的字符:就是那些不是简单的七位ASCII,如汉字,中文标点,当然也包括%[] {}|等特殊字符。例如:

//结果:123abcABC
encodeURI("123abcABC")
//结果:"520%E9%9B%AA%E7%8B%90"
encodeURI("520雪狐")
//结果:"%25%7C%5B%5D%7B%7D"
encodeURI("%|[]{}")

URL编码原理:就是编码的逆过程,不再赘述。

注意:decodeURI也仅对URL编码解码,普通字符解码后依旧是普通字符,例如:

//结果:"234"
decodeURI('234')
//结果:我爱你
decodeURI("%E6%88%91%E7%88%B1%E4%BD%A0")
//结果:我爱你
decodeURI("我爱你")