2013-07-26 81 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"}'); 
}); 

什麼是正確的方式來設置快速字符編碼?

+3

做什麼'res.json({「status」:「0」});'? – mkoryak

+0

因爲我不知道 - 謝謝! – Kay

+0

先閱讀文檔,然後代碼;) – 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解釋爲UTF-8。在您調試您的應用程序時,這會讓您感到非常困惑。設置res.charSet仍然是一個好主意。 – cleong

+1

同意@Deiwin。有必要指定字符集。它在默認情況下不會被解釋爲UTF-8。解決我的問題在我的情況。 – Saeger

1

遇到類似問題我從數據庫中收集瑞典字符並將它們輸出爲JSON對象,當數據庫中的字符不是UTF-8時,節點並不關心json是否必須是UTF-8或不是。 8,所以假設「你不需要設置任何東西」是錯誤的。取決於你正在處理的字符集。

+0

不是一個真正的答案,而是對@ dankohn答案的評論。 – robertklep

15

你可能會想一個字符集顯式地添加到您的內容類型的字符串結束時,如果你發現它沒有被設置已經由快遞:

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

的字符集是總是設置自動地和確實需要設置爲才能在任何地方正常工作(即使用所有瀏覽器和所有ajax庫),否則您可能會遇到編碼錯誤。

在快速4.x的具體我發現,根據不同的對象,你試圖返回,它通常自動content-type: application/json; charset=utf-8當你調用res.json(someObject),但並不總是返回。

在某些對象上調用res.json()時,它可以返回content-type: application/json(即不帶字符集編碼!)。我不確定是什麼觸發了這一點,除了它是關於返回的特定對象的東西。

我只注意到它是因爲自動化測試明確檢查了標題,發現它在某些響應中缺少字符集聲明(即使內容類型仍爲application/json)。

+1

「charset」只能用於文本/ *資源。 「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

即使有客戶對此感到窒息,您也正在引入一個合規客戶端的問題,因爲他們不應該期望從應用程序/ *媒體類型中去除字符集。最好停止使用破損的客戶端,而不是打破所有工作的客戶端。 –

相關問題