Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何处理包含非utf8字符的GET参数?_Node.js_Character Encoding_Express_Query String - Fatal编程技术网

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

Node.js 如何处理包含非utf8字符的GET参数?,node.js,character-encoding,express,query-string,Node.js,Character Encoding,Express,Query String,在基于nodejs/express的应用程序中,我需要处理GET请求,这些请求可能包含使用iso-8859-1字符集编码的UMLAUT 不幸的是,它的querystring解析器似乎只处理普通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: '

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

不幸的是,它的querystring解析器似乎只处理普通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
是否有一个隐藏选项或其他干净的方法使此功能也适用于其他字符集?默认行为的主要问题是,我无法知道是否存在解码错误-毕竟,输入可能只是简单地解码为看起来仍然像URL编码字符串的内容。

可能是一个解决方案。你知道使用哪种编码吗

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();
在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。

这是什么环境?我得到qs.parse('foo=bar&xyz=T%FCt%20T%FCt'){foo:bar',xyz:T�t t�t'}在节点为v0.8.16Linux的Linux Mint 13中,从使用LC_CTYPE=UTF8的终端运行,但我不认为这会影响执行此任务的行为:oThanks(结合一些手动提取相关查询字符串参数)。我不能拒绝这些请求,因为它们在某种程度上是有效的。它们来自mp3流媒体程序,包含歌曲标题。。显然,其中一些程序并不关心发送正确的UTF8,只是简单地使用id3标记中的任何内容。。。