[SOLVED] iconv 转码失败,求解,谢谢
发布于 3年前 作者 lanisle 2816 次浏览
var fs = require('fs');
var iconv = require('iconv');

jsdom.env('http://www.ppnba.com/',  ['https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'], function(error, window) {
    var title = window.$('title').text();
    console.log(u(title));
};

function u(s) {
    return (new iconv.Iconv('GBK', 'UTF-8//TRANSLIT//IGNORE')).convert(new Buffer(s)).toString();
}

上面的代码分析ppnba(gb2312)的时候尝试输出title,可是转码前后在shell里输出的都是乱码,无奈了。

9 回复

为什么我无法访问www.ppnba.com?

福建电信,正常访问,你那可能是DNS问题吧?

curl http://www.ppnba.com curl: (56) Recv failure: Connection reset by peer

ping正常 dns应该对吧

PING www.ppnba.com (59.51.24.230) 56(84) bytes of data.
64 bytes from 59.51.24.230: icmp_req=1 ttl=111 time=225 ms

IP 是正常的,你访问IP会有一个IIS的错误页,试试看?

function u(s) {return (new iconv.Iconv('GBK', 'UTF-8//TRANSLIT//IGNORE')).convert(new Buffer(s)).toString();

问题应该在 new Buffer这里吧,jsdom不知是怎么处理gbk编码的(它没依赖iconv),但是所以这是个问题,你用jquery获取到的string应该就是乱码的, new Buffer(s,encoding) 时,指定s的编码,这样应该能正常的解析出来。

jsdom既然无法直接处理gbk编码,那么 先 curl http://www.ppnba.com/ 得到 一个 stream,将这个stream 全部写入buffer,将这个buffer iconv 成 utf-8的html, 将这个html 提供给jsdom

对的,是jsdom本身处理gbk就出问题了

谢谢,的确是jsdom的问题,最后如此解决:

var fs = require('fs');
var iconv = require('iconv');
var jsdom = require('jsdom');
var request = require('request');

request({uri: 'http://www.ppnba.com/', encoding: 'binary'},
    function(error, response, body) {
        body = new Buffer(body, 'binary');
        conv = new iconv.Iconv('gbk', 'utf8');
        body = u(body).toString();

        jsdom.env({
            html: body,
            // src: [fs.readFileSync('./jquery.min.js').toString()],
            scripts: ['https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js']]
            done: function(error, window) {
                var $ = window.$;
                console.log($('title').text());
            }
        });
    }
);

jsdom的选项也提供了encoding的配置,但无法直接处理,所以只好嵌套着写了。

参考:如何转换编码 http://stackoverflow.com/questions/5135450/nodejs-http-response-encoding 日语编码转换的补丁

nodejs gbk编码问题的典型案例呀,哈哈哈,顶LZ

回到顶部