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

Dra*_*ake 7 javascript utf-8 node.js

这是我目前的整个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);
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*Ong 16

也许你必须这样做:

'Content-Type': 'application/xhtml+xml; charset=utf-8'
Run Code Online (Sandbox Code Playgroud)


Alb*_*r31 8

根据: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"
Run Code Online (Sandbox Code Playgroud)

使用下面的两个代码,可以使用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);
Run Code Online (Sandbox Code Playgroud)

长表:

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);
Run Code Online (Sandbox Code Playgroud)

如果我从IE8在HTML页面中录制,泰语字符保存得很好.


Dra*_*ake 1

不管你相信与否,我在互联网上遇到的这个问题是由于...... Internet Explorer。在这种情况下,Internet Explorer 11 认为以 UTF-16 保存“查看源”窗口的结果是可以接受的,无论原始页面编码是什么。因此,我的 localhost 测试页面保存为 utf16,google.com 保存为 utf16,等等。安装了 Firefox 及其 utf8 就眼睛所见。

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

:(