写网站的时候,前端表单发送数据到nodejs服务器,发送的数据会出现一些乱码,像下面这样:
userName=%E7%8F%AD%E8%A1%A5&email=zhaopin%40junmatek.com&info=%E8%B7%AF1388%E5%8F%B7%E6%B0%91%E6%B6%A6%E5%A4%A7%E5%8E%A6%E4%B8%80%E5%8F%B7
百分号编码原理
百分号编码(也被称为URI编码)的产生是为了防止SQL注入,所以将一些特殊字符转换为对应的百分号编码,详细原理可以自行搜索。
nodejs如何解码
decodeURI()函数
let url = "userName=%E7%8F%AD%E8%A1%A5&email=zhaopin%40junmatek.com&info=%E8%B7%AF1388%E5%8F%B7%E6%B0%91%E6%B6%A6%E5%A4%A7%E5%8E%A6%E4%B8%80%E5%8F%B7"
let decode_url = decodeURI(url)
console.log(decode_url)
控制台打印出来的结果如下:
userName=班补&email=zhaopin%40junmatek.com&info=路1388号民润大厦一号
可以看到“%40”(也就是“@”)没有转换,这是因为“@”在encodeURI()函数中属于保留字符,不会转换换为百分号编码,所以对应的解码函数decodeURI()也不会对其进行解码。(上面的url是firefox浏览器提交ajax表单的时候产生的)
decodeURIComponent()函数
“@”“#”“$”…等符号不属于encodeURIComponent()函数的保留字,所以其对应的解码函数decodeURIComponent()函数可以将“%40”转为“@”符号。
let url = "userName=%E7%8F%AD%E8%A1%A5&email=zhaopin%40junmatek.com&info=%E8%B7%AF1388%E5%8F%B7%E6%B0%91%E6%B6%A6%E5%A4%A7%E5%8E%A6%E4%B8%80%E5%8F%B7"
let decode_url = decodeURIComponent(url)
console.log(decode_url)
控制台的输出如下:
userName=班补&[email protected]&info=路1388号民润大厦一号
不睡觉 网友写的解码函数
这个大家可以看看,理解一下解码的过程,其实挺简单的。
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文档。
致谢
不睡觉《nodejs处理url中的百分号编码》