使用iconv 从gb2312转utf-8经常出错
/**
* 采集39问答网
*/
var n = require('needle')
var $ = require('jquery')
var iconv = require('iconv').Iconv;
n.get('http://ask.39.net/browse/313-2-1.html',{encoding:'gb2312'},function(error,response,body){
//console.log(response.statusCode)
var buf = new Buffer(body,'binary');
var content = new iconv('gb2312','UTF8').convert(buf).toString()
//采集到的链接
var href = {}
$(content).find('.bt').each(function(index,value){
href[$(value).attr('href')] = $(value).attr('href')
})
console.log(href)
})
经常出现下面的错误。
throw errnoException('EILSEQ', 'Illegal character sequence.');
^
Error: Illegal character sequence.
at errnoException (D:\node.js\node_modules\iconv\lib\iconv.js:137:13)
at convert (D:\node.js\node_modules\iconv\lib\iconv.js:85:17)
at Iconv.convert (D:\node.js\node_modules\iconv\lib\iconv.js:108:12)
at D:\node.js\cj39.js:11:46
at handle_output (D:\node.js\node_modules\needle\lib\needle.js:227:16)
at Object.Needle.response_end (D:\node.js\node_modules\needle\lib\needle.js:242:7)
at IncomingMessage.<anonymous> (D:\node.js\node_modules\needle\lib\needle.js:187:16)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:883:14
at process._tickCallback (node.js:415:13)
3 回复
(iconv:大人,这不是小人的错呀,错的是大…大…,错的是这个世界。) 吐槽完毕,先赞一个,这是近期看到规格最完备的求助帖,有代码有报错,难得,虽然代码贴重复一部分,虽然犯的错比较低级。。。
如果确定抓取的网页编码是gb2312,那么needle抓取后没必要转码。
var buf = new Buffer(body,'binary');
var content = new iconv('gb2312','UTF8').convert(buf).toString()
这2句可以删除,body本身已经是utf-8,可console.log(body)
验证。why?见needle文档response options的decode选择说明:https://github.com/tomas/needle#response-options
另外{encoding:'gb2312'}
的作用是指定post数据的编码,与response无关。
吧这两行代码删除掉console出来的是乱码。必须要转,但是转码经常会出现错误。
var n = require('needle'),
fs=require('fs');
n.get('http://ask.39.net/browse/313-2-1.html',
{encoding:'gb2312'},
function(error,response,body){
fs.appendFileSync('result.html',body);
//乱码?非也,这是因为win的控制台是gbk编码,如果是unix控制台就
console.log(body);
})
打开result.html,这是标准的utf8文档。needle内部调用iconv-lite已经转码完毕了。