2013-07-26 9 views
15

は、私が得たと言う:Node.js/Express - レスポンス文字エンコーディングを設定するにはどうすればよいですか?

app.get('/json', function(req, res) { 
    res.set({ 
     'content-type': 'application/json' 
    }).send('{"status": "0"}'); 
}); 

ノー成功を収めて、次でUTF-8として応答を送信しようとしている:

app.get('/json', function(req, res) { 
    // From Node.js Official Doc 
    // http://nodejs.org/api/http.html#http_http_request_options_callback 
    res.setEncoding('utf8'); 

    res.set({ 
     'content-type': 'application/json' 
    }).send('{"status": "0"}'); 
}); 

Expressで文字エンコーディングを設定する正しい方法は何ですか?

+3

'res.json({" status ":" 0 "});'? – mkoryak

+0

私はそれについて知らなかったので - ありがとう! – Kay

+0

最初にコードを読んでからcode;) – mkoryak

答えて

8

使用res.charset:http://expressjs.com/api.html#res.charset

res.charset = 'value'; 
res.send('some html'); 
// => Content-Type: text/html; charset=value 

あなたが何かを設定する必要はありませんので、しかし、JSONは、デフォルトではUTF-8です。

+2

これはExpress 4で変更されています。https://github.com/visionmedia/express/wiki/Migrating%20from%203.x%20to%204.x#rescharset – Deiwin

+1

WebブラウザはJSONをテキストとして見たとき、JSONを必ずUTF-8と解釈するわけではありません。あなたがあなたのアプリをデバッグしている間、それは混乱することがあります。 res.charSetを設定することは、今でも良い考えです。 – cleong

+1

@Deiwinとの合意。文字セットを指定する必要があります。それはデフォルトではUTF-8と解釈されません。私の場合、私の問題を解決しました。 – Saeger

1

私はデータベースからスウェーデン文字を収集してJSONオブジェクトとして出力していますが、ノードの文字列はUTF-8でなければなりません。データベースからの文字がUTF-あなたが何かを設定する必要はないと仮定すると、偽です。使用している文字セットによって異なります。

+0

本当に答えはありませんが、@ dankohnの答えに対するコメントです。 – robertklep

15

あなたはおそらく、あなたはそれがExpressですでに設定されていない見つけた場合、明示的にあなたのコンテンツ型文字列の末尾に文字セットを追加することになるでしょう:

res.set({ 'content-type': 'application/json; charset=utf-8' }) 

文字セットが常に自動的に設定されていないされており、 は、をどこでも正しく動作させる必要があります(つまり、すべてのブラウザとすべてのajaxライブラリで動作するようにする必要があります)。あなたがres.json(someObject)を呼び出すときに、特に私は、オブジェクトに応じて、あなたが返すようにしようとしていることを発見したエクスプレス4.xで

、それは通常は自動的しかし必ずしも、content-type: application/json; charset=utf-8を返します。

一部のオブジェクトでres.json()を呼び出すと、content-type: application/json(つまり、文字セットエンコーディングなし)を返すことができます。私は実際に何がこれをトリガするかはわかりませんが、返される特定のオブジェクトに関するものです。

私は、ヘッダーを明示的にチェックし、いくつかのレスポンス(たとえコンテンツタイプがまだapplication/jsonだったとしても)で文字セット宣言が欠落していることが判明した自動テストのために気がつきました。

+1

"charset"はtext/*リソースでのみ使用してください。 "application/json"は定義上UTF-8です。それを指定する必要はありません。 –

+0

@RichRemer RFCによると 'application/json' _は常にUTF(特にデフォルトではUTF-8)であり、charsetプロパティを持たないのですが、実際には設定しなければ多くの消費者が結果を変えるでしょう[いくつかのブラウザを含む](http://stackoverflow.com/questions/25267649/why-do-some-browsers-seem-to-require-a-utf-8-charset-on-json-data-for-display)それが共通のパターンである理由です。 –

+1

それに気をつけているクライアントがあっても、アプリケーション/ *メディアタイプから文字セットを取り除くことを期待してはいけないので、クライアントに適合することに問題があります。壊れたクライアントの使用を中止するよりも、動作しているクライアントをすべて破棄する方が良いでしょう。 –