Node.js HTTP响应编码

3

是否可能在非UTF8编码下阅读网页?例如windows-1251。 我尝试使用node-iconv转换结果:

var convertedBody = new Iconv('windows-1251','utf-8').convert(responseBody));

但我收到了异常:
Error: EILSEQ, Illegal character sequence.
    at IncomingMessage.<anonymous> (/root/nodejstest/test2.js:22:19)
    at IncomingMessage.emit (events.js:59:20)
    at HTTPParser.onMessageComplete (http.js:111:23)
    at Socket.ondata (http.js:1183:22)
    at Socket._onReadable (net.js:654:27)
    at IOWatcher.onReadable [as callback] (net.js:156:10)

谢谢!


1
你是否已经查看了nodejs谷歌组的这个帖子?它似乎针对你的问题... - schaermu
4个回答

7

这里有一个解决您问题的有效方案。您需要使用缓冲区并首先将字符串转换为二进制。

request({ 
uri: website_url,
method: 'GET',
encoding: 'binary'
}, function (error, response, body) {
    body = new Buffer(body, 'binary');
    conv = new iconv.Iconv('windows-1251', 'utf8');
    body = conv.convert(body).toString();
     }
});

4

看看iconv-lite库。 使用它,您的代码可能如下所示:

var iconv = require('iconv-lite');
request(
    { 
        uri: website_url,
        method: 'GET',
        encoding: 'binary'
    },
    function(err, resp, body){
        body = iconv.decode(body, 'win1251');
    }
);

3

Iconv 不支持 windows-1251 编码。

您可以从 bnoordhuis/node-iconv 验证编码列表。

顺便提一下,根据维基百科的说法:

ISO 8859-5 相比,Windows-1251 和 KOI8-R(或其乌克兰变体KOI8-U)更常用。


0
const request = require('request');
const iconv = require('iconv-lite');

request({
    url: 'http://meta.ua',
    encoding: 'binary',
}, (err,res,body) => {
    if (err) throw err;

    var decoded = iconv.decode(res.body, 'win1251');

    console.log(decoded);
});

请勿发布裸代码,同时提供代码的解释说明其功能。 - Jonathan Mee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接