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

How to encode HTTP response body as UTF-8 in node.js

本文关键字:正文 响应 编码 UTF-8 HTTP 中将 node js      更新时间:2023-09-26

这是我的整个节点.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?

也许你必须这样做:

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

根据 : https://www.w3.org/International/articles/http-charset/index 和 https://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 录制,泰语字符会很好地保留。

不信由你,我在互联网上遇到的这个问题是由于......IE浏览器。在这种情况下,Internet Explorer 11 认为无论原始页面编码如何,都可以以 UTF-16 格式保存"查看源代码"窗口的结果。因此,我来自本地主机的测试页面被保存为 utf16,google.com 被保存为 utf16,等等。

当他们说IE是一个糟糕的浏览器时,我不相信他们。我想我们有时都必须学习。

:(

如果您使用的是">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",因为它支持更多字符......祝你好运。