Voglio fare una richiesta HTTP usando node.js per caricare del testo da un server web. Poiché la risposta può contenere molto testo (alcuni Megabyte), voglio elaborare ciascun blocco di testo separatamente. Posso ottenere questo usando il seguente codice:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Questo sembra funzionare senza problemi. Tuttavia, voglio supportare la compressione HTTP, quindi uso zlib:
var zip = zlib.createUnzip();
// NO res.setEncoding('utf8') here since we need the raw bytes for zlib
res.on('data', function(chunk) {
// do something like checking the number of bytes downloaded
zip.write(chunk); // give the raw bytes to zlib, s.b.
});
zip.on('data', function(chunk) {
// convert chunk to utf8 text:
var textChunk = chunk.toString('utf8');
// process utf8 text chunk
});
Questo può essere un problema per caratteri multi-byte come il '\u00c4'quale consiste di due byte: 0xC3e 0x84. Se il primo byte è coperto dal primo blocco ( Buffer) e il secondo byte dal secondo blocco, chunk.toString('utf8')verranno generati caratteri errati alla fine / all'inizio del blocco di testo. Come posso evitarlo?
Suggerimento: ho ancora bisogno del buffer (in particolare il numero di byte nel buffer) per limitare il numero di byte scaricati. Quindi usare res.setEncoding('utf8')come nel primo codice di esempio sopra per i dati non compressi non soddisfa le mie esigenze.