请求返回unicode替换字符

时间:2015-03-06 17:00:50

标签: javascript node.js request

使用request模块加载网页,我注意到英国英镑符号£我有时会取回unicode替换字符\uFFFD

我正在解析的示例网址是此亚马逊英国网页:http://www.amazon.co.uk/gp/product/B00R3P1NSI/ref=s9_newr_gw_d38_g351_i2?pf_rd_m=A3P5ROKL5A1OLE&pf_rd_s=center-2&pf_rd_r=0Q529EEEZWKPCVQBRHT9&pf_rd_t=101&pf_rd_p=455333147&pf_rd_i=468294

我还使用iconv-lite模块使用响应头中返回的字符集进行解码:

request(urlEntry.url, function(err, response, html) {
    const contType = response.headers['content-type'];
    const charset = contType.substring(contType.indexOf('charset=') + 8, contType.length);

    const encBody = iconv.decode(html, charset);
...

但这似乎并没有帮助。我还尝试将响应HTML解码为UTF-8

如何避免使用此Unicode替换字符?

1 个答案:

答案 0 :(得分:1)

首先,亚马逊网页采用ISO-8859-1编码,而不是UTF-8编码。这是导致Unicode替换字符的原因。您可以在响应标头中进行检查。我使用了curl -i

其次,请求的自述文件说:

  

encoding - 要在响应数据的setEncoding上使用的编码。如果   null,body作为Buffer返回。别的什么(包括   默认值undefined)将作为encoding参数传递   to toString()(意思是默认情况下这实际上是utf8)。

默认情况下是UTF-8 ...(经过一些实验)我们发现很遗憾它不支持ISO-8859-1。但是,如果我们将编码设置为null,则可以使用iconv-lite解码生成的Buffer。

这是一个示例程序。

var request = require('request');
var iconvlite = require('iconv-lite');

var url = "http://www.amazon.co.uk/gp/product/B00R3P1NSI/ref=s9_newr_gw_d38_g351_i2?pf_rd_m=A3P5ROKL5A1OLE&pf_rd_s=center-2&pf_rd_r=0Q529EEEZWKPCVQBRHT9&pf_rd_t=101&pf_rd_p=455333147&pf_rd_i=468294";

request({url: url, encoding: null}, function (error, response, body) {
   if (!error && response.statusCode == 200) {
       var encoding = 'ISO-8859-1';
       var content = iconvlite.decode(body, encoding);
       console.log(content);
   }

});

这个问题有点相关,我在解决这个问题时使用了它: http.get and ISO-8859-1 encoded responses