Node.js与HTTP响应主体的unicode问题

时间:2011-11-04 10:52:24

标签: javascript node.js unicode utf-8 v8

使用本机“http”模块的HTTP请求的响应主体,显示unicode字符的问号字符,而不是实际值。这是我正在运行的基本代码片段。

var http = require('http');
var google = http.createClient(80, 'www.google.it');
var request = google.request('GET', '/',
{
 'host': 'www.google.it',
}
  );
request.end();
request.on('response', function (response) {
  response.setEncoding('utf8');
  response.on('data', function (chunk) {
    console.log(chunk);
  });
});

在回复中,有一个以“ Pubblicit ”开头的特定单词。它的最后一封信是一个奇怪的角色,向我展示了一个问号。这个词应该是Pubblicità,而是显示为 Pubblicit?

我还尝试使用.toString()输出数据:

console.log(chunk.toString());

console.log(chunk.toString('utf8'));

但我得到的结果相同。

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

我设置response.setEncoding('binary');并且它有效。不知道为什么。

参考:http://groups.google.com/group/nodejs/browse_thread/thread/3bd3935b1f42a5f4?pli=1

答案 1 :(得分:5)

原因可能是,如果我们没有在请求标题上指定“googleKnownAsUTF8OK”用户代理,谷歌会回复内容类型为ISO-8859-1的html文档(对于旧浏览器,机器人?我不知道) ,因此通过“二进制”解码响应缓冲区是正确的。

但是,如果我们用utf8解码ISO-8859-1中编码的缓冲区,那么字节0xe0(à)意味着“连续形成一个3字节的字符”,在我们的例子中它是一个格式错误的字符,所以a显示了很少的意外字符(取决于环境)。

我们可以尝试“Mozilla / 5.0”作为用户代理的价值。祝你好运。

答案 2 :(得分:0)

  

我设置了response.setEncoding('binary');它的工作原理。不知道为什么   虽然。

     

参考:   http://groups.google.com/group/nodejs/browse_thread/thread/3bd3935b1f42a5f4?pli=1

在我的情况下,由于旧网页的windows-1252字符集,我有一些错误的字符。

我刚刚在请求选项中使用了encode:'binary',它确实有效!