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を意味するのであれば、バイトはユニコードコードポイントと正確に一致するため、非常に簡単です。

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

Web上ではおそらく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 に答える