15

Node.JS のこのリクエスト ライブラリを使用してこのページを取得し、 cheerioを使用して本文を解析しています。

解析された応答本文を呼び出す$.html()と、ページの title 属性が次のようになっていることがわかります。

<title>Le Relais de l'Entrec?te</title>

...いつあるべきか:

<title>Le Relais de l'Entrecôte</title>

リクエスト ライブラリのオプションを include に設定しようとしましたがencoding: 'utf8'、何も変わらないようです。

これらの文字を保存するにはどうすればよいですか?

4

2 に答える 2

32

変換自体にはiconv (またはより良いiconv-lite ) を使用できますが、エンコーディングを検出するには、 charsetおよびjschardeモジュールをチェックアウトする必要があります。両方が実際に動作している例を次に示します。

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);
});

于 2013-09-10T06:27:08.570 に答える
22

ページは iso-8859-1 でエンコードされているようです。requestエンコードされていないバッファを渡すことで戻すように指示し、 node-iconvencoding: nullなどを使用して変換する必要があります。

一般化されたクローラーを作成している場合は、遭遇した各ページのエンコードを検出して正しくデコードする方法を理解する必要があります。それ以外の場合は、次のように機能するはずです。

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 ..                                                                             
});                                                                             
于 2012-09-08T00:37:56.533 に答える