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

Node.js / Express - How do I set response character encoding?

本文关键字:设置 响应 字符 编码 js Express- 何设置 Node      更新时间:2023-09-26

假设我得到了:

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

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

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

字符集是而不是总是自动设置的,并且确实需要设置才能在任何地方正确工作(即使用所有浏览器和所有ajax库),否则可能会遇到编码错误。

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

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

我之所以注意到它,是因为自动测试明确检查了标头,发现它在一些响应中缺少字符集声明(尽管内容类型仍然是application/json)。

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

这对我有效

res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});

遇到类似的问题,我从数据库中收集瑞典语字符并将其输出为JSON对象,当数据库中的字符不是UTF-8时,node并不关心JSON是否必须是UTF-8。因此,假设"您不需要设置任何内容"是错误的。取决于您使用的字符集。

在手动设置标头参数之前,请检查服务器默认情况下已经发送的内容。在我的例子中,我使用的是一个"无服务器"云提供的Node.js实例。显然,这些通常是前端的w/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