2012-08-20 13 views
10

Sto cercando di ottenere la codifica corretta con richiesta.nodejs con richiesta

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

Non importa quello che faccio, la codifica dei caratteri danesi non è corretta.

Qualche idea?

+0

Che editor stai usando? – Amberlamps

+1

Hai mescolato 'encoding' con l'intestazione' content-type' - per esempio: "codifica": "utf-8" '. Ma la pagina è codificata in "ISO-8859-1" piuttosto che in "UTF-8". Per questo, vedi http://stackoverflow.com/questions/8915404/http-get-and-iso-8859-1-encoded-responses. –

+0

@Amberlamps: Sto usando il blocco note ++ – hippie

risposta

27

È possibile utilizzare iconv (lite) per convertire questo. È inoltre necessario indicare alla richiesta di non impostare attivamente la codifica sul valore predefinito di UTF-8 impostando la proprietà di codifica su null. Pertanto si dovrebbe fare:

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

Forse il tuo problema è in 'Accept-Encoding' intestazione. Diciamo che avete intestazioni come 'Accept-Encoding': 'gzip,deflate'

Se è così, ci sono 2 modi per fissare questo:

  1. rimuovere questo Header
  2. Utilizzare il seguente codice per decomprimere i dati:

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

La rimozione di 'accept-encoding' dall'intestazione della richiesta ha risolto il problema per me. Grazie. –