如何在NodeJS中进行字符集编码/解码?

3

I have this code :

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)?

谢谢,对我的英语表示歉意 ;)


我知道可以使用请求选项 encoding,但问题是我还不知道页面的字符集(可以通过标题或元标记了解)。 - William
2个回答

2
该网站可以在返回的内容类型头部或者返回的HTML中的内容类型meta标签中返回内容编码,例如:
<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

首先,您可以发送一个 Accept-Charset 标头,这将防止网站使用其他字符集发送数据。

一旦您收到响应,您可以检查 Content-Type 标头的 charset 条目并进行适当的处理。

另一个技巧(我过去曾使用过)是在内容编码未知时尝试使用所有可能的内容编码进行解码,并坚持不会抛出异常的那个(虽然在 Python 中使用)。


你也可以尝试在这个页面上宣布的模块:http://groups.google.com/group/nodejs/browse_thread/thread/38dc4444b2e1436c,这里是直接链接:https://github.com/franzenzenhofer/whatlang - dhruvbird

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