http.get和ISO-8859-1编码响应
我即将写RSS提要提取器,并遇到一些charset问题。http.get和ISO-8859-1编码响应
与编码相比,加载和解析提要相当容易。 我正在用http.get
加载订阅源,我在每个数据事件中都将这些块放在一起。 后来我使用npm-lib feedparser
解析整个字符串,该字符串与给定的字符串正常工作。
不幸的是,我习惯于在php中使用像utf8_encode()
这样的函数,并且我在node.js中错过了它们,所以我被使用了Iconv,它目前没有做我想做的事。
没有编码有几个UTF8的错误字符集-icons,经过iconv,字符串被解析错误:?/
目前我seperatedly编码每个字符串:
//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);
});
我应该开始用数据缓冲区编码或稍后使用完整的字符串?
谢谢!
PS:编码与解析XML
的头部确定怎么样的模块,这使得在node.js中的编码更容易?
您可能遇到与https://groups.google.com/group/nodejs/browse_thread/thread/b2603afa31aada9c上描述的相同的问题。
解决方案似乎是在用Iconv处理Buffer之前将响应编码设置为二进制。
相关位是
组response.setEncoding( '二进制')和调用Iconv.convert之前聚集块到缓冲区()。请注意,encoding = binary表示您的数据回调将接收Buffer对象,而不是字符串。
更新:这是我最初的反应
你确定你收到的饲料已正确编码?
我可以看到两个可能的错误:
- 进料正与Latin-1的编码后的数据发送,但用
Content-Type
,指出charset=UTF-8
。 - 订阅源正在使用UTF-8编码数据发送,但
Content-Type
标头没有声明任何内容,默认为ASCII。
您应该使用Wireshark或cURL等实用程序检查您的源内容和发送的头文件。
我认为这个问题可能与您在将数据传递给feedparser之前存储数据的方式有关。这是很难没有看到你的数据的事件处理程序的说法,但我会猜,你正在做这样的事情:
values = '';
stream.on('data', function(chunk){
values += chunk;
});
是吗?
的问题是,在这种情况下,块是一个缓冲区,并通过使用“+”附加它们放在一起,您隐缓冲区转换为字符串。
展望进一步,你真的应该做对整个饲料iconv转换,通过feedparser运行前,因为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'));
});
是你有没有工作? – loganfsmyth 2012-01-18 20:33:15
我无法获得iconv编码权 – moe 2012-01-18 20:44:29
因此,文章对象编码不正确,而是包含垃圾?你可以显示饲料吗? – fent 2012-01-19 03:47:16