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

时间:2013-07-26 04:15:10

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

5 个答案:

答案 0 :(得分:20)

如果您发现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(即没有charset编码!)。我不确定是什么触发了这个,除了它是关于返回的特定对象的东西。

我之所以注意到它是因为自动化测试明确检查了标题并发现它在某些响应中缺少charset声明(即使内容类型仍为application/json)。

答案 1 :(得分: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 :(得分:2)

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

答案 3 :(得分: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 

答案 4 :(得分:0)

这对我有用

parent.addEventListener("click", function(e) {
     var x = e.clientX, y = e.clientY,
     elementMouseIsOver = document.elementFromPoint(x, y);

     //Only run this on IE
     if (/MSIE|Trident/.test(window.navigator.userAgent);) {
         elementMouseIsOver.click()
     }
})