【问题标题】:How to handle GET parameters containing non-utf8 characters?如何处理包含非 utf8 字符的 GET 参数?
【发布时间】:2013-01-02 18:15:15
【问题描述】:

在基于 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 字符串。

【问题讨论】:

  • 这是在什么环境下?我在带有节点 v0.8.16 的 Linux Mint 13 中得到> qs.parse('foo=bar&xyz=T%FCt%20T%FCt') { foo: 'bar', xyz: 'T�t T�t' }
  • Linux,使用 LC_CTYPE=UTF8 从终端运行,但我不认为这会影响行为:o

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


【解决方案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。

【讨论】:

  • 谢谢,完成了这项工作(结合一些手动提取相关查询字符串参数)。我不能拒绝这些请求,因为它们在某种程度上是有效的。它们来自 mp3 流媒体程序并包含歌曲标题.. 显然其中一些程序并不关心发送正确的 UTF8,而只是使用 id3 标签中的任何内容......
【解决方案2】:

也许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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2014-07-31
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多