如何在node.js中将HTTP响应体编码为UTF-8

12

目前这是我整个node.js服务器代码:

require('http').createServer(function (req, resp) {
    var html = [
        '<!DOCTYPE html>',
        '<html>',
            '<head>',
                '<meta charset="utf-8" />',
                '<title>Sample Response</title>',
            '</head>',
            '<body>',
                '<p>Hello world</p>',
            '</body>',
        '</html>'
    ].join('');

    resp.writeHead(200, {
        'Content-Length': Buffer.byteLength(html, 'utf8'),
        'Content-Type': 'application/xhtml+xml;'
    });
    resp.write(html, 'utf8');
    resp.end();
}).listen(80);

根据我对node.js文档的理解,resp.write()的第二个参数'utf8'应该导致node将HTML字符串编码为UTF-8,而不是JavaScript字符串本地表示的UTF-16。但是,当我将浏览器指向localhost:80,查看源代码并将其保存到本地HTML文件时,Notepad ++告诉我该文件以UTF-16编码。此外,当我通过W3C HTML验证器工具运行它时,它还抱怨“内部编码声明utf-8与文档的实际编码(utf-16)不符”。

如何强制node.js将我的HTTP响应正文编码为UTF 8?


你能否启动一个数据包嗅探器(如Wireshark),并发布一份你所看到的样本吗?我不理解这种行为。 - Brad
你是通过文件上传还是直接指向网站进行验证? - Joachim Isaksson
我已经在Linux和Windows下使用WebStorm和Sublime Text进行了测试(共4次),所有测试都显示为UTF-8。也许这是Notepad ++的问题? - Luc Morin
4个回答

18

也许你需要做:

'Content-Type': 'application/xhtml+xml; charset=utf-8'

发送图片时是否也使用字符集会是个好主意,还是只用于文本? - B''H Bi'ezras -- Boruch Hashem

14
根据:https://www.w3.org/International/articles/http-charset/indexhttps://en.wikipedia.org/wiki/List_of_HTTP_header_fields
推荐的HTTP头应该是这样的:
"Content-Type: text/html; charset=utf-8"

使用以下两个代码,可以在IE8浏览器中以utf-8格式进行记录。 即使法语XP32不允许在记事本++中显示泰语字符。

简短形式:

var http = require('http');

var server = http.createServer(function(req, res) {
    var body = '<p>Hello Döm</p>\n \
  <p>How are you ?</p>\n \
  <p>ผมหมาป่า(I am The Wolf)</p>';

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

server.listen(8080);

长篇形式:

var http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});

  var title = 'Sample Response'
  var body = '<p>Hello Döm</p>\n \
  <p>How are you ?</p>\n \
  <p>ผมหมาป่า(I am The Wolf)</p>';

  var code =  [
        '<!DOCTYPE html>',
        '<html>',
            '<head>',
                '<meta charset="utf-8" />',
                '<title>' + title + '</title>',
            '</head>',
            '<body>',
                body,
            '</body>',
        '</html>'
    ].join('\n');

  res.write(code, "utf8");
  res.end(); 
});

server.listen(8080);

如果我在HTML页面中使用IE8录制,泰语字符会被完好地保留。


1
在发送图片时,是否也应该发送UTF-9头信息? - B''H Bi'ezras -- Boruch Hashem

1
相信还是不相信,我现在遇到的互联网问题是由于……Internet Explorer引起的。在这种情况下,Internet Explorer 11认为无论原始页面编码是什么,都可以将“查看源代码”窗口的结果保存为UTF-16。因此,我的本地主机测试页面以utf16格式保存,google.com也以utf16格式保存,等等。安装Firefox后,其UTF-8格式一览无余。
当他们说IE是一个糟糕的浏览器时,我并不相信。我想我们有时候都必须学习一下。
:(

0
如果你正在使用“node-http”,则可以按照以下方式完成:
result.writeHead(200, {"Content-Type": "text/plain; charset=utf-8"});

如果您正在使用“express”,则可以按照以下方式进行操作:
result.set({ 'Content-Type': 'text/plain; charset=utf-8' }); 

假设您从数据库返回数据,您还必须确保字符集设置为“utf-8”。请按以下步骤转到数据库连接并将utf8mb4添加为您的字符集:
mysql.createConnection({
    host: 'db_host',
    port: 3306,
    user: 'root',
    password: 'password',
    database: 'database',charset : 'utf8mb4',
    
});

如果你需要返回包含Unicode字符的文本,那么最好的选择是将字符集设置为“utf8mb4”,因为它支持更多的字符...祝你好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接