25

说我得到:

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 中设置字符编码的正确方法是什么?

4

5 回答 5

34

如果您发现 Express 尚未设置它,您可能希望在内容类型字符串的末尾显式添加一个字符集:

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

charset并不总是自动设置,需要设置为在任何地方都能正常工作(即所有浏览器和所有 ajax 库),否则您可能会遇到编码错误。

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

当调用res.json()某些对象时,它可以返回content-type: application/json(即没有字符集编码!)。我实际上不确定是什么触发了这个,除了它与返回的特定对象有关。

我只注意到它是因为自动化测试明确检查了标头并发现它缺少某些响应的字符集声明(即使内容类型仍然是 application/json)。

于 2014-01-22T13:56:23.690 回答
13

使用 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,因此您无需设置任何内容。

于 2013-07-26T09:01:24.797 回答
3

这对我有用

res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
于 2019-07-12T17:18:22.020 回答
2

有类似的问题,我从数据库中收集瑞典字符并将它们作为 JSON 对象输出,当数据库中的字符不是 UTF-8 时,节点并不关心 json 是否必须是 UTF-8。所以假设“你不需要设置任何东西”是错误的。取决于您使用的字符集。

于 2013-10-22T08:34:04.227 回答
1

在您手动设置标头参数的麻烦之前,请检查您的服务器已经默认发送的内容。就我而言,我使用的是“无服务器”云提供的 Node.js 实例。显然,这些通常是带有 NGINX 的前端,我认为这是基于默认设置设置这些东西的。...我根本不需要res.set任何东西。诚然,我正在返回 HTML,...只是说 - 在您修复之前,请确保它已损坏。

accept-ranges: bytes
accept-ranges: bytes
cache-control: private
content-encoding: gzip
content-type: text/html; charset=utf-8
date: Fri, 21 Dec 2018 21:40:37 GMT
etag: W/"83-xwilN/BBLLLAAAHHH/0NBLAH0U"
function-execution-id: 5thvkjd4wwru
server: nginx
status: 200
vary: accept-encoding, cookie, authorization
via: 1.1 varnish
x-cache: MISS
x-cache-hits: 0
x-cloud-trace-context: 18c611BBBBLLLLAAAHHH9594d9;o=1
x-powered-by: Express
x-served-by: cache-dfw18631-DFW
x-timer: S15BBLLLAAHHH.913934,VS0,VE3404 
于 2018-12-21T21:47:04.040 回答