Кодирование nodejs с использованием запроса

Я пытаюсь получить правильную кодировку с запросом.

request.get({
    "uri":'http://www.bold.dk/tv/',
    "encoding": "text/html;charset='charset=utf-8'"
  },
  function(err, resp, body){    
    console.log(body);
  }
);

Независимо от того, что я делаю, кодировка датских символов неправильна.

Любые мысли?

Ответ 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

Вы можете использовать iconv (lite), чтобы преобразовать это. Вам также необходимо указать запрос не активно устанавливать кодировку по умолчанию UTF-8, установив для свойства кодирования значение null. Поэтому вы должны:

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);
  }
);

Ответ 3

У меня такая же проблема, с request v2.88.0.

Обратитесь к ответу woolfi 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 сможет правильно преобразовать строку.