请求返回 unicode 替换字符
Request returning unicode replacement character
使用 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 模块使用响应中返回的字符集进行解码 header:
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 替换字符?
首先,亚马逊网页采用 ISO-8859-1 编码,而非 UTF-8。这就是导致 Unicode 替换字符的原因。您可以在响应 headers 中检查这一点。我用了 curl -i
.
其次,请求的自述文件说:
encoding - Encoding to be used on setEncoding of response data. If
null, the body is returned as a Buffer. Anything else (including the
default value of undefined) will be passed as the encoding parameter
to toString() (meaning this is effectively utf8 by default).
默认情况下它是 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
使用 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 模块使用响应中返回的字符集进行解码 header:
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 替换字符?
首先,亚马逊网页采用 ISO-8859-1 编码,而非 UTF-8。这就是导致 Unicode 替换字符的原因。您可以在响应 headers 中检查这一点。我用了 curl -i
.
其次,请求的自述文件说:
encoding - Encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the encoding parameter to toString() (meaning this is effectively utf8 by default).
默认情况下它是 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