如何处理包含非utf8字符的GET参数?

时间:2013-01-01 16:03:41

标签: node.js character-encoding express query-string

在基于nodejs / express的应用程序中,我需要处理GET请求,这些请求可能包含使用iso-8859-1 charset编码的变音符号。

不幸的是,它的查询字符串解析器似乎只处理纯ASCII和UTF8:

> qs.parse('foo=bar&xyz=foo%20bar')
{ foo: 'bar', xyz: 'foo bar' } # works fine
> qs.parse('foo=bar&xyz=T%FCt%20T%FCt')
{ foo: 'bar', xyz: 'T%FCt%20T%FCt' } # iso-8859-1 breaks, should be "Tüt Tüt"
> qs.parse('foo=bar&xyz=m%C3%B6p')
{ foo: 'bar', xyz: 'möp' } # utf8 works fine

是否有隐藏选项或其他干净方式使其与其他字符集一起使用?默认行为的主要问题是我无法知道是否存在解码错误 - 毕竟,输入可能已被解码为仍然看起来像的东西一个urlencoded字符串。

2 个答案:

答案 0 :(得分:1)

URL encoding应该始终使用UTF-8,其他情况可以视为编码攻击,只是拒绝请求。不存在这样的 作为非utf8角色的东西。我不知道为什么你的应用程序可以在任何编码中获取查询字符串,但如果你只是使用字符集,你可以使用浏览器 页面上的标题。对于API请求或其他任何内容,您可以指定UTF-8并拒绝无效的UTF-8作为错误请求。

如果你真的是指ISO-8859-1,那么它非常简单,因为字节完全匹配unicode代码点。

'T%FCt%20T%FCt'.replace( /%([a-f0-9]{2})/gi, function( f, m1 ) {
    return String.fromCharCode(parseInt(m1, 16));
});

虽然网上可能不是ISO-8859-1但实际上是Windows-1252。

答案 1 :(得分:0)

也许node-iconv是一个解决方案。您是否知道使用了哪种编码?

var qs = require('qs');
var Buffer = require('buffer').Buffer;
var Iconv  = require('iconv').Iconv;

var parsed = qs.parse('foo=bar&xyz=T%FCt%20T%FCt');
var iconv = new Iconv('ISO-8859-1', 'UTF-8');
var buffer = iconv.convert(parsed.xyz);
var xyz = buffer.toString();