Как кодировать / декодировать кодировку кодировки в NodeJS? - PullRequest
2 голосов
/ 23 апреля 2011

У меня есть этот код:

request({ url: 'http://www.myurl.com/' }, function(error, response, html) {
  if (!error && response.statusCode == 200) {
    console.log($('title', html).text());
  }
});

Но сайты, которые я сканирую, могут иметь другую кодировку (utf8, iso-8859-1 и т. Д.), Как получить его и кодировать / декодировать HTML всегда в нужную кодировку (utf8)?

Спасибо и извините за мой английский;)

Ответы [ 2 ]

2 голосов
/ 10 сентября 2013

Веб-сайт может возвращать кодировку содержимого в заголовке типа содержимого или метатег типа содержимого в возвращенном HTML, например:

<meta http-equiv="Content-Type" content="text/html; charset=latin1"/>

Вы можете использовать модуль charset , чтобы автоматически проверить оба из них для вас. Однако не все веб-сайты или серверы будут указывать кодировку, поэтому вы захотите найти кодировку по самим данным. Модуль jschardet может помочь вам в этом.

После того, как вы поработали с кодировкой, вы можете использовать модуль iconv для выполнения фактического преобразования. Вот полный пример:

request({url: 'http://www.myurl.com/', encoding: 'binary'}, function(error, response, html) {
    enc = charset(response.headers, html)
    enc = enc or jchardet.detect(html).encoding.toLowerCase()
    if enc != 'utf-8'
        iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE')
        html = iconv.convert(new Buffer(html, 'binary')).toString('utf-8')
    console.log($('title', html).text());
});
0 голосов
/ 26 апреля 2011

Сначала вы можете отправить заголовок Accept-Charset , который не позволит веб-сайтам отправлять данные в других кодировках.

Получив ответ, вы можете проверить заголовок Content-Type для записи charset и выполнить соответствующую обработку.

Anothr hack (я использовал в прошлом), когда кодировка контента неизвестна, это попытка декодировать, используя все возможные кодировки контента, и придерживаться той, которая не выдает исключение (хотя в python, хотя).

...