登录
注册
node.js 学习社区
request库使用时, gb2312、GBK中文乱码解决方法

李珊珊

2014-12-01 01:47

使用http库或者request库请求一个url地址时,中文全部乱码了。弄了好久,问题终于解决了,下面给出解决方案,

iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。

需要引入三个库 request、iconv-lite、bufferhelper

中文问题完美解决

/**
 * @param url 需要抓取的url地址
 * @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

原文引自:http://cnodejs.org/topic/53142ef833dbcb076d007230

回复 · 2

发表回复

你可以在回复中 @ 其他人