写网站的时候,前端表单发送数据到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中的百分号编码