【问题标题】:Request returning unicode replacement character请求返回 unicode 替换字符
【发布时间】:2015-03-06 17:00:50
【问题描述】:

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

我正在解析的示例 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

我还使用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 替换字符?

【问题讨论】:

    标签: javascript node.js request


    【解决方案1】:

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

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

    encoding - 用于响应数据的 setEncoding 的编码。如果 null,主体作为缓冲区返回。其他任何东西(包括 undefined 的默认值)将作为编码参数传递 到 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

    【讨论】:

    • 谢谢科林。您的回答与我目前所做的相结合,让一切都按我的意愿工作。干杯。
    猜你喜欢
    • 2012-02-05
    • 2018-04-19
    • 2011-04-26
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2017-11-08
    相关资源
    最近更新 更多