URL编码

Javascript编码函数:escape()encodeURI()以及encodeURIComponent()

只有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'(),、以及某些保留字,才可以不经过编码直接用于URL。

encodeURI()

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

1
2
3
4
5
encodeURI("http://www.baidu.com?wd=what's wrong?") 
// "http://www.baidu.com?wd=what's%20wrong?"

encodeURI("春节")
// "%E6%98%A5%E8%8A%82"

encodeURIComponent()

encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。因此,;/?:@&=+$,#,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码(不对单引号'编码)。至于具体的编码方法,两者是一样。对应的解码函数是decodeURIComponent()

1
2
encodeURIComponent("http://www.baidu.com?wd=what's wrong?")
//"http%3A%2F%2Fwww.baidu.com%3Fwd%3Dwhat's%20wrong%3F"

在添加或提取url参数时注意对参数值进行encodeURIComponentdecodeURIComponent,避免参数值中包含特殊字符影响url解析。

escape()

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

1
2
3
escape("春节") // "%u6625%u8282"

escape("hello word") // "hello%20word"

参考文章

阮一峰的网络日志关于URL编码