nodejs encoding using request
Maybe your trouble is in 'Accept-Encoding'
header.
Let's say you have Headers like 'Accept-Encoding': 'gzip,deflate'
If it's so, you have 2 ways to fixing this:
- Remove this Header
Use the following code to unzip the data:
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; } });
You can use iconv (lite) to convert this. You also need to tell request not to actively set the encoding to the default of UTF-8 by setting the encoding property to null. Therefore you should do:
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);
}
);