发布时间:2020-02-25编辑:佚名阅读(1701)
写网站的时候,前端表单发送数据到nodejs服务器,发送的数据会出现一些乱码,像下面这样:
nickname=%E5%B0%8F%E5%88%98&gender=%E7%94%B7&email=12345%40qq.com&password=xiaoliu
百分号编码原理
上网查了后发现,百分号编码(也被称为URI编码)的产生是为了防止SQL注入,所以将一些特殊字符转换为对应的百分号编码。
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文档。
0人
0人
0人
0人