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

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

不幸的是,它的查询stringparsing器似乎只处理纯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 

有没有隐藏的选项或其他干净的方式来使这个工作与其他的字符集呢? 默认行为的主要问题是,我无法知道是否存在解码错误 – 毕竟,input可能是简单解码的东西,看起来像一个urlencodedstring。

那么URL编码应该总是UTF-8,其他情况下可以被视为编码攻击,只是拒绝请求。 没有非UTF8字符的东西。 我不知道为什么你的应用程序可以获得任何编码的查询string,但如果你只是在你的页面上使用一个字符集标题,你会适应浏览器。 对于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。

也许node-iconv是一个解决scheme。 你知道哪种编码被使用了吗?

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