3

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

不幸的是,它的查询字符串解析器似乎只处理纯 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 字符串的东西。

4

2 回答 2

1

那么URL 编码应该始终是 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。

于 2013-01-02T10:15:15.570 回答
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();
于 2013-01-01T21:49:21.823 回答