Javascript Node.js unicode问题与HTTP响应正文

Javascript Node.js unicode问题与HTTP响应正文,javascript,node.js,unicode,utf-8,v8,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('re

使用本机“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);
  });
});
在回复中,有一个特定的单词以“publiblicit”开头。它的最后一个字母是一个奇怪的字符,在我看来是个问号。单词应该是publiblicitá,而不是显示为publiblicit?

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

但我得到了同样的结果


有什么想法吗?

I set
response.setEncoding('binary')并且它可以工作。不知道为什么


参考资料:

原因可能是,如果我们不在请求头上指定“googleKnownAsUTF8OK”用户代理,google将响应内容类型为ISO-8859-1的html文档(对于旧浏览器,bots?我不知道),所以用“二进制”解码响应缓冲区是正确的

但是,如果我们用utf8对ISO-8859-1中编码的缓冲区进行解码,那么字节0xe0(θ)意味着“将一个字符以3个字节的形式形成一行”,在我们的例子中,它是一个格式错误的字符,因此会显示一些意外的字符(取决于环境)

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

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

参考:

在我的例子中,由于旧网页的windows-1252字符集,我有一些错误的字符


我刚刚在请求选项中使用了encode:“binary”,它成功了

尝试检查
chunk.charCodeAt(chunk.length-1)
。如果是
224
a
),问题在于您的控制台/区域设置。@PabloFernandez,使用Mac OS X SnowLeopard@katspaugh我使用另一个测试用例测试了
charCodeAt
,该测试用例使用字母
é
,并为该字母输出
65533
。奇怪吧?我没有用字母
尝试它,因为这需要我找出后者在谷歌响应中的索引,但它可能会输出类似于
65533
的内容。这个答案在我的情况下有效,我在Python shell使用中遇到了这个问题。
console.log(chunk.toString());
console.log(chunk.toString('utf8'));