10

这是目前我的整个 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?

4

3 回答 3

19

也许你必须这样做:

'Content-Type': 'application/xhtml+xml; charset=utf-8'
于 2013-10-13T02:57:24.103 回答
12

根据: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 录制,泰语字符会得到很好的保留。

于 2016-05-04T16:37:55.507 回答
0

信不信由你,我在互联网上遇到的这个问题是由于... Internet Explorer。在这种情况下,Internet Explorer 11 出于某种原因认为以 UTF-16 格式保存“查看源代码”窗口的结果是可以接受的,无论原始页面编码是什么。因此,我的本地测试页面被保存为 utf16,google.com 被保存为 utf16,等等。安装了 Firefox 及其 utf8,一目了然。

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

于 2013-10-12T23:51:11.857 回答