nodejs处理url中的百分号编码
写网站的时候,前端表单发送数据到nodejs服务器,发送的数据会出现一些乱码,像下面这样:
nickname=%E5%B0%8F%E5%88%98&gender=%E7%94%B7&email=12345%40qq.com&password=xiaoliu
百分号编码原理
上网查了后发现,百分号编码(也被称为URI编码)的产生是为了防止SQL注入,所以将一些特殊字符转换为对应的百分号编码。详细原理可以去看下面的博客。
url 编码(percentcode 百分号编码)
nodejs如何解码
这里主要讲几种百分号编码nodejs环境下的解码方式。
decodeURI()函数
let url = "nickname=%E5%B0%8F%E5%88%98&gender=%E7%94%B7&email=12345%40qq.com&password=xiaoliu"
let decode_url = decodeURI(url)
console.log(decode_url)
控制台打印出来的结果如下:
'nickname=小刘&gender=男&email=12345%40qq.com&password=xiaoliu'
可以看到“%40”(也就是“@”)没有转换,这是因为“@”在encodeURI()函数中属于保留字符,不会转换换为百分号编码,所以对应的解码函数decodeURI()也不会对其进行解码。(上面的url是edge浏览器提交表单的时候产生的,其他几个主流的浏览器不知道“@”符号会不会被编码)
decodeURIComponent()函数
“@”“#”“$”…等符号不属于encodeURIComponent()函数的保留字,所以其对应的解码函数decodeURIComponent()函数可以将“%40”转为“@”符号。
let url = "nickname=%E5%B0%8F%E5%88%98&gender=%E7%94%B7&email=12345%40qq.com&password=xiaoliu"
let decode_url = decodeURIComponent(url)
console.log(decode_url)
控制台的输出如下:
'nickname=小刘&gender=男&email=12345@qq.com&password=xiaoliu'
解码成功!
自己写解码函数
这个大家可以看看,理解一下解码的过程,其实挺简单的。
function decode(url) {
let reg = /(%(\w|[abcdef])(\w|[abcdef]))+/g
let code = url.match(reg)
let replace_reg = /%/g
let decode_reg = /(%(\w|[abcdef])(\w|[abcdef]))+/
for(let i = 0; i < code.length; i ++) {
code[i] = code[i].replace(replace_reg, "") //去掉百分号
code[i] = new Buffer(code[i], "hex").toString() //转换为utf-8字符
url = url.replace(decode_reg, code[i]) //替换百分号编码
}
return url
}
先将编码段用正则表达示匹配出来,存在code数组中。然后将code数组中的代码段去掉百分号,形成的十六进制编码段再转换为对应的编码(这里页面的编码为utf-8,有时候页面编码可能是gb2312,注意区分清楚),最后用生成的字符替换url中的百分号编码。
nodejs的"querystring"中也有相应的解码函数,详细可以参考nodejs的API文档。
作者:不睡觉
来源:CSDN
原文:https://blog.csdn.net/weixin_42829466/article/details/81283671
版权声明:本文为博主原创文章,转载请附上博文链接!