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 回复
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
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的问题,最后如此解决:
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 日语编码转换的补丁