请求返回unicodereplace字符

使用请求模块加载一个网页,我注意到,对于他英国的英镑符号,我有时会取回Unicodereplace字符\uFFFD

我正在parsing的一个示例URL是这个Amazon UK页面: 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

我怎样才能避免这个Unicodereplace字符?

首先,亚马逊网页以ISO-8859-1编码,而不是UTF-8编码。 这是导致Unicodereplace字符的原因。 你可以在响应头中检查这个。 我用curl -i

其次,请求的README说:

编码 – 编码用于setEncoding响应数据。 如果为null,则正文返回为Buffer。 其他任何东西(包括未定义的默认值)都将作为编码parameter passing给toString()(这意味着默认是有效的)。

默认情况下是UTF-8 …并且(经过一些实验),我们发现它不幸地不支持ISO-8859-1。 但是,如果我们将编码设置为空,则可以使用iconv-lite解码得到的缓冲区。

这是一个示例程序。

 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和ISO-8859-1编码的响应