Node.js/Express - 如何设置响应字符编码?

gsk*_*lee 21 javascript node.js express

说我得到了:

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

我试图将响应作为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"}');
});
Run Code Online (Sandbox Code Playgroud)

在Express中设置字符编码的正确方法是什么?

Iai*_*ins 25

如果您发现Express尚未设置,则可能需要在内容类型字符串的末尾显式添加字符集:

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

字符集并不总是自动设置,并且需要设置为在所有浏览器和所有ajax库中正确工作,否则您可能会遇到编码错误.

在Express 4.x中,我发现根据您尝试返回的对象,它通常会content-type: application/json; charset=utf-8在您调用时自动返回res.json(someObject),但并非总是如此.

当调用res.json()某些对象时,它可以返回content-type: application/json(即没有charset编码!).我不确定是什么触发了这个,除了它是关于返回的特定对象的东西.

我只注意到它,因为自动化测试明确检查了标题,发现它在某些响应中缺少charset声明(即使内容类型仍然存在 application/json).

  • "charset"只应用于text/*资源.根据定义,"application/json"是UTF-8; 没有必要指定它. (2认同)
  • 即使有客户对此感到窒息,您也会给符合标准的客户带来问题,因为他们不应该期望从 application/* 媒体类型中剥离字符集。最好停止使用损坏的客户端,而不是破坏所有可用的客户端。 (2认同)
  • @RichRemer 添加此信息不会导致确认客户出现问题。这在 RFC 7159 中有明确说明(并在上面链接的答案中引用)。 (2认同)

Dan*_*ohn 10

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

res.charset = 'value';
res.send('some html');
// => Content-Type: text/html; charset=value
Run Code Online (Sandbox Code Playgroud)

但是,JSON默认为UTF-8,因此您无需设置任何内容.

  • Express 4已经改变了.请看这里:https://github.com/visionmedia/express/wiki/Migrating%20from%203.x%20to%204.x#rescharset (3认同)
  • 当您将其视为文本时,Web 浏览器不一定会将 JSON 解释为 UTF-8。在您调试应用程序时,这可能会让人非常困惑。设置 res.charSet 仍然是一个好主意。 (2认同)