iconv-lite 转编码的问题
发布于 9 年前 作者 wtcsy 18669 次浏览 最后一次编辑是 8 年前 来自 问答

var request = require(“request”); var iconv = require(“iconv-lite”);

request.get(“http://www.163.com”,function(err,response,result){ var html = iconv.decode(new Buffer(result), ‘win1251’) //var html = iconv.decode(new Buffer(result), ‘gbk’) console.log(html) });

代码就是上面的
怎么都是乱码,不知道为什么??

11 回复

result已经是decode过了的结果,也就是说它已经被转换成utf8了,再转换成 buffer 出来的结果必须是不正确的。 看下示例代码 https://github.com/ashtuchkin/iconv-lite#extend-nodejs-own-encodings 另外 request 有 pipe 方法,可以 pipe 到 iconv-lite 的 decodeStream 上面去

没试出来耶 一定是我的打开方式不对

var request = require(“request”); var iconv = require(“iconv-lite”);

request.get(“http://www.163.com”,function(err,response,result){ var d = iconv.decodeStream(‘win1251’) var r = response.pipe(d) console.log® });

如果按照1楼的说的话, 可能是这样的

request.get("http://www.163.com", function (err, response, result) {
}).pipe(iconv.decodeStream('gb2312')).collect(function (err, body) {
    console.log(body);
});

如果就在终端输出. 在request的时候加上encoding避免自动转成UTF-8的话, 就可以在返回的时候转码了. 不过可能是老办法了.

request.get("http://www.163.com", {encoding: "binary"}, function (err, response, result) {
    console.log(iconv.decode(new Buffer(result, 'binary'), 'gb2312'));
});

@meteormatt 按你的来操作 都是乱码呀!~~

@wtcsy 好吧,看下面:

var iconv = require('iconv-lite');
var request = require('request');

request.get('http://www.163.com').pipe(iconv.decodeStream('gbk')).collect(function(err, body) {
  console.log(body);
});

@wtcsy 我这里都是正常的…

@meteormatt @klesh 你们的都是对的!!! 我的错 我用的sublime test3的nodejs来打印的,居然打印不出来, 在命令行打印都是正确的 多谢各位!~~

为什么我打印的时候不是乱码 但是写入文件的时候又变成乱满了??? request.get(“http://www.163.com”, {encoding: “binary”}, function (err, response, result) { var html = iconv.decode(new Buffer(result, ‘binary’), ‘gbk’) console.log(html) fs.writeFileSync(“1.html”, html,“gbk”); });

@wtcsy 写文件用第一种方式就可以了.

request.get("http://www.163.com").pipe(iconv.decodeStream('gb2312')).pipe(fs.createWriteStream('1.html'));

@wtcsy 你首先要明白一点,node.js是以utf-8为中心的,iconv.decode 之后,返回的就是 utf-8 的串。 所以console.log输出是正确的。如果你需要的是 gbk 编码,那就不要转换了,直接写文件。 可是你在写的时候,又指定 gbk ,那编码又对不上了! 编码确实是个头疼的问题,但是没办法,电脑不是咱们发明的。

按9楼的方法,写出来的文件会是 utf8 的。

多谢楼上2位大神耐心解答!~

回到顶部