2

他の場所で発生している問題を示すために、簡単な node.js プログラムを作成しました。

次の node.js プログラムがあるとします。

var http = require('http');
http.createServer(function (req, res) {
// simple repro for json deserializaiton error cause by right quote character '’'
var json = { 'foo': 'bar’s answer' };
var write = JSON.stringify(json);
res.writeHead(200, { 'Content-Type': 'application/json', 'Content-Length': write.length });
res.end(write);
}).listen(8085, '127.0.0.1');

Chrome の Advanced Rest Client を使用してこれに POST すると、200 OK 応答が返されますが、応答のコンテンツの JSON タブに、解析された json の代わりに「予期しない入力の終わり」という用語が表示されます。

raw タブでは、"{"foo":"bar's answer" という文字列が表示され、json を解析できなかった理由が明らかになります (最後の '}' がありません)。

元のオブジェクトから ''' を削除すると、応答が戻ったときに問題なく解析されます。

単純な ''' が json の解析に失敗する理由は何ですか? 私のテストでは、他のさまざまなキャラクターで同じ問題に遭遇しました。

4

1 に答える 1

12

代わりにContent-Lengthをに設定する必要があります。byteLength

res.writeHead(200, {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(write)
});

とは異なるため、次のようになりますString length

console.log('bar’s answer'.length);             // 12
console.log(Buffer.byteLength('bar’s answer')); // 14

これは、UTF-8 エンコーディング(ノードのデフォルト) では、文字列が完全にASCII コード ポイント(U+0000 - U+007F) で構成されている場合にのみ一致し、この文字列にはU+2019が含まれいるためです。引用、そうです。」その範囲を超えると、コード ポイントは必要に応じて複数バイト (U+2019 の場合は 3) に拡張されます。

[ 0xE2, 0x80, 0x99 ]
于 2013-02-05T05:20:58.870 に答える