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

发布于 2024-11-02 15:45:03 字数 315 浏览 0 评论 0原文

我有这个代码:

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

谢谢并抱歉我的英语;)

I have this code :

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

But the websites that Im crawling can have different charset (utf8, iso-8859-1, etc..) how to get it and encode/decode the html always to the right encoding (utf8) ?

Thanks and sorry for my english ;)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

把梦留给海 2024-11-09 15:45:03

网站可以在返回的 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());
});

The website could return the content encoding in the content-type header or the content-type meta tag inside the returned HTML, eg:

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

You can use the charset module to automatically check both of these for you. Not all websites or servers will specify an encoding though, so you'll want to fall back to detecting the charset from the data itself. The jschardet module can help you with that.

Once you've worked out the charset you can use the iconv module to do the actual conversion. Here's a full example:

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());
});
是伱的 2024-11-09 15:45:03

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

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

当内容编码未知时,另一种黑客(我过去使用过)是尝试使用所有可能的内容编码进行解码,并坚持使用不会引发异常的编码(尽管在 python 中使用)。

First up, you could send an Accept-Charset header which would prevent websites from sending data in other charsets.

Once you get a response, you can check the Content-Type header for the charset entry and do appropriate processing.

Anothr hack (I've used in the past) when the content encoding is unknown is try to decode using all possible content encodings and stick to the one that doesn't throw an exception (using in python though).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文