nodejs处理url中的百分号编码

发布时间: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文档。

    关键字: nodejs url 百分号编码


鼓掌

0

正能量

0

0

呵呵

0


评论区