使用http库或者request库请求一个url地址时,中文全部乱码了。弄了好久,问题终于解决了,下面给出解决方案,
iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。 需要引入三个库 request、iconv-lite、bufferhelper
中文问题完美解决
/**
* [@param](/user/param) url 需要抓取的url地址
* [@param](/user/param) calback
*/
function fetchContent(url,calback){
var req = request(url, {timeout: 10000, pool: false});
req.setMaxListeners(50);
req.setHeader('user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')
.setHeader('accept', 'text/html,application/xhtml+xml');
req.on('error', function(err) {
console.log(err);
});
req.on('response', function(res) {
var bufferHelper = new BufferHelper();
res.on('data', function (chunk) {
bufferHelper.concat(chunk);
});
res.on('end',function(){
var result = iconv.decode(bufferHelper.toBuffer(),'GBK');
calback(result);
});
});
}
#介绍下GBK编码 Unicode是全世界通用编码 UTF8,UTF16,UTF32只是Unicode的实现方式之一。UCS2是UTF16的子集,UCS2编码中每个Unicode使用两个字节编码,高字节在高位。Node.JS支持Buffer.toString(‘UTF8’)和Buffer.toString(‘UCS2’)。 GBK也是Unicode的实现方式之一,总共23940个编码,
UTF8与GBK进行转换,可以把Unicode作为中间编码。 UTF8编解Unicode规则简单,参见 UTF8 GBK编解Unicode无特定规则,一般可通过查表方式 GBK兼容ascii码,ascii字符用一字节编码,最高位为0,其它字符用两位编码,高字节从0x81。编解码时通过此规律对单字节和双字节字符加以区分。由此可见,GBK是单字节、双字节变长编码。 理解了上面几点后,编解码GBK文件其实只需要一个GBK–>Unicode的码表就够了。GBK编码时,通过Unicdoe–>GBK,生成相应的GBK字节流;GBK解码时,通过GBK–>Unicode,生成UCS2字节流,再通过buffer.toString(‘UCS2’)即可转换成string对象。
npm install iconv-lite
var iconv = require('iconv-lite');
var str = iconv.decode(buf, 'GBK'); //return unicode string from GBK encoded bytes
var buf = iconv.encode(str, 'GBK');//return GBK encoded bytes from unicode string
感谢分享
有人写了个叫 gbk 的库,可以直接请求GBK编码的网页:https://npmjs.org/package/gbk
感觉复杂了…如果认真阅读一下request 的源码的话会发现
var response = function (err, response, body) {
//返回的body 直接就是buffer 了...
var buf = iconv.decode(body, 'gb2312');
}
request.get({
url : url ,
encoding : null //让body 直接是buffer
}, response);
node处理编码问题比python还麻烦么?
request.get({ encoding: null, url: ‘…’ }) setEncoding( null ),得到的就是 raw data 了