为什么我不能在nodejs HTTP响应中写中文字符?

All*_*uin 8 utf-8 cjk node.js

这是我的小代码:

var http = require('http');
var port = 9002;
var host_ip = '<my_ip>';
http.createServer(function (req, res) {
    var content = new Buffer("Hello ??", "utf-8")
    console.log('request arrived');
    res.writeHead(200, {
        'Content-Encoding':'utf-8',
        'charset' : 'utf-8',
        'Content-Length': content.length,
        'Content-Type': 'text/plain'});
    res.end(content.toString('utf-8'),'utf-8');
}).listen(port, host_ip);
console.log('server running at http://' + host_ip + ':' + port);
Run Code Online (Sandbox Code Playgroud)

以前我只是res.end发送"你好世界",它运作良好.然后我想调整一点,将'世界'改成中文等同的'世界',然后将标题中的'charset''内容类型'改为'utf-8'.但在Chrome和Firefox中我看到了这个:

hello ???
Run Code Online (Sandbox Code Playgroud)

然而,令人惊讶的歌剧(11.61)确实显示了正确的结果hello ??.我想知道我是否错过了代码中的某些内容,以及为什么会发生这种情况.感谢你们.

我认为这篇文章与我的情况类似,但并不完全相同.

jjr*_*jrv 13

问题在于字符集规范.对我来说,这适用于这种变化:

'Content-Type': 'text/plain;charset=utf-8'
Run Code Online (Sandbox Code Playgroud)

使用Chrome,Firefox和Safari进行测试.

您还可以查看node.js包"express",它允许重写您的代码,如下所示:

var express=require('express');

var app=express.createServer();

app.get('/',function(req, res) {
    var content = "Hello ??";

    res.charset = 'utf-8';
    res.contentType('text');
    res.send(content);
});

app.listen(9002);
Run Code Online (Sandbox Code Playgroud)