request库使用时, gb2312、GBK中文乱码解决方法
发布于 1年前 作者 shanelau 2371 次浏览

使用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
4 回复

有人写了个叫 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还麻烦么?

回到顶部