Node.JS刮编码?

nee*_*zer 12 unicode encoding node.js

我在Node.JS中使用此请求库获取此页面,并使用cheerio解析主体.

调用$.html()已解析的响应主体会显示该页面的title属性为:

<title>Le Relais de l'Entrec?te</title>
Run Code Online (Sandbox Code Playgroud)

......什么时候应该:

<title>Le Relais de l'Entrecôte</title>
Run Code Online (Sandbox Code Playgroud)

我已经尝试设置请求库的选项以包含encoding: 'utf8',但这似乎没有改变任何东西.

我该如何保留这些字符?

Ben*_*ing 27

您可以使用iconv(或更好的iconv-lite)进行转换,但要检测编码,您应该检查charsetjschardet模块.以下是它们的实例:

var charset = require('charset'),
    jschardet = require('jschardet'),
    Iconv = require('iconv').Iconv;

request.get({url: 'http://www.example.com', encoding: 'binary'}, function(err, res, body) {
    var enc = charset(res.headers, body) || jschardet.detect(body).encoding.toLowerCase();

    if(enc !== 'utf8') {
        var iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE');
        body = iconv.convert(new Buffer(body, 'binary')).toString('utf8');
    }

    console.log(body);
});
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个更好的答案,因为它需要考虑响应标头. (3认同)
  • 是的,这绝对是一个更好的答案,应该是公认的答案 (2认同)
  • 这应该是正确的答案.它巧妙地使用所有可用的方法(除了要求网站的开发人员)检测编码,它成功! (2认同)

wul*_*ong 20

该页面似乎用iso-8859-1编码.你需要告诉request你通过传递encoding: null和使用像node-iconv这样的东西来转发未编码的缓冲区.

如果您正在编写通用爬虫,则必须弄清楚如何检测您遇到的每个页面的编码以正确解码它,否则以下内容适用于您的情况:

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

request.get({                                                                   
  url: 'http://www.relaisentrecote.fr',                                         
  encoding: null,                                                               
}, function(err, res, body) {                                                   
  var ic = new iconv.Iconv('iso-8859-1', 'utf-8');                              
  var buf = ic.convert(body);                                                   
  var utf8String = buf.toString('utf-8');  
  // .. do something with utf8String ..                                                                             
});                                                                             
Run Code Online (Sandbox Code Playgroud)