我正在尝试通过请求获得正确的编码。
request.get({
"uri":'http://www.bold.dk/tv/',
"encoding": "text/html;charset='charset=utf-8'"
},
function(err, resp, body){
console.log(body);
}
);
无论我做什么,丹麦字符的编码都不对。
有什么想法吗?
答案 0 :(得分:31)
您可以使用iconv(lite)转换它。您还需要通过将encoding属性设置为null来告诉请求不要将编码设置为默认的UTF-8。因此你应该这样做:
var iconv = require('iconv-lite');
request.get({
uri:'http://www.bold.dk/tv/',
encoding: null
},
function(err, resp, body){
var bodyWithCorrectEncoding = iconv.decode(body, 'iso-8859-1');
console.log(bodyWithCorrectEncoding);
}
);
答案 1 :(得分:1)
也许您的问题出在'Accept-Encoding'
标题中。
假设你有像'Accept-Encoding': 'gzip,deflate'
如果是这样,你有2种方法来解决这个问题:
使用以下代码解压缩数据:
const req = request(options, res => {
let buffers = []
let bufferLength = 0
let strings = []
const getData = chunk => {
if (!Buffer.isBuffer(chunk)) {
strings.push(chunk)
} else if (chunk.length) {
bufferLength += chunk.length
buffers.push(chunk)
}
}
const endData = () => {
let response = {code: 200, body: ''}
if (bufferLength) {
response.body = Buffer.concat(buffers, bufferLength)
if (options.encoding !== null) {
response.body = response.body.toString(options.encoding)
}
buffers = []
bufferLength = 0
} else if (strings.length) {
if (options.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
strings[0] = strings[0].substring(1)
}
response.body = strings.join('')
}
console.log('response', response)
};
switch (res.headers['content-encoding']) {
// or, just use zlib.createUnzip() to handle both cases
case 'gzip':
res.pipe(zlib.createGunzip())
.on('data', getData)
.on('end', endData)
break;
case 'deflate':
res.pipe(zlib.createInflate())
.on('data', getData)
.on('end', endData)
break;
default:
res.pipe(zlib.createInflate())
.on('data', getData)
.on('end', endData)
break;
}
});
答案 2 :(得分:0)
我遇到同样的问题,request v2.88.0
。
请参考woolf makkinan的答案,我找到了解决问题的简单方法。
request.get({
"uri":'http://www.bold.dk/tv/',
"encoding": "text/html;charset='charset=utf-8'",
"gzip: true // notice this config.
},
function(err, resp, body){
console.log(body);
}
);
在gzip: true
选项中添加request
,request
将处理gzip,然后blob可以正确转换为字符串。