http.get和ISO-8859-1编码响应

我即将写一个RSS提要提取器,并坚持一些字符集问题。

与编码相比,加载和parsing提要相当容易。 我使用http.get加载feed,并且将每个数据事件放在一起。 后来我用npm-lib的feedparserparsing了整个string,它与给定的string一起工作正常。

不幸的是,我习惯于像php中的utf8_encode()函数,我在node.js中错过了它们,所以我坚持使用Iconv,它目前没有做我想做的事情。

没有编码,有几个UTF8?图标错误的字符集,与iconv,stringparsing错误:/

目前我正在分隔编码每个string:

 //var encoding ≈ ISO-8859-1 etc. (Is the right one, checked with docs etc.) // Shortend version var iconv = new Iconv(encoding, 'UTF-8'); parser.on('article', function(article){ var object = { title : iconv.convert(article.title).toString('UTF-8'), description : iconv.convert(article.summary).toString('UTF-8') } Articles.push(object); }); 

我应该开始用数据缓冲区编码还是以后用完整的string编码?

谢谢!

PS:编码是通过parsingxml的头部来确定的

如何使node.js中的编码更容易?

您可能遇到了https://groups.google.com/group/nodejs/browse_thread/thread/b2603afa31aada9c上所述的相同问题。

解决scheme似乎是在用Iconv处理Buffer之前将响应编码设置为二进制。

相关位是

设置response.setEncoding('binary')并在调用Iconv.convert()之前将块聚合到缓冲区中。 请注意,encoding = binary表示您的数据callback将接收Buffer对象,而不是string。


更新这是我最初的回应

您确定您收到的Feed已经正确编码了吗?

我可以看到两个可能的错误:

  1. 该订阅源正在使用Latin-1编码的数据发送,但Content-Type表示charset=UTF-8
  2. 该订阅源正在使用UTF-8编码数据发送,但Content-Type标头没有声明任何内容,默认为ASCII。

您应该使用Wireshark或cURL等实用程序检查您的源内容和发送的头文件。

我认为这个问题可能是你在将数据传递给feedparser之前存储数据的方式。 很难说没有看到你的数据事件处理程序,但我会猜测你正在做这样的事情:

 values = ''; stream.on('data', function(chunk){ values += chunk; }); 

是对的吗?

问题是,在这种情况下,块是一个缓冲区,并通过使用“+”将它们附加在一起,你隐式地将缓冲区转换为一个string。

仔细研究它,在通过feedparser运行之前,您应该在整个提要上进行iconv转换,因为feedparser可能不知道其他编码。

尝试这样的事情:

 var iconv = new Iconv('ISO-8859-1', 'UTF8'); var chunks = []; var totallength = 0; stream.on('data', function(chunk) { chunks.push(chunk); totallength += chunk.length; }); stream.on('end', function() { var results = new Buffer(totallength); var pos = 0; for (var i = 0; i < chunks.length; i++) { chunks[i].copy(results, pos); pos += chunks[i].length; } var converted = iconv.convert(results); parser.parseString(converted.toString('utf8')); });