Quiero hacer una solicitud HTTP usando node.js para cargar texto de un servidor web. Como la respuesta puede contener mucho texto (algunos Megabytes), quiero procesar cada fragmento de texto por separado. Puedo lograr esto usando el siguiente código:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Esto parece funcionar sin problemas. Sin embargo, quiero admitir la compresión HTTP, por lo que 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
});
Esto puede ser un problema para los caracteres de varios bytes como el '\u00c4'que consta de dos bytes: 0xC3y 0x84. Si el primer byte está cubierto por el primer fragmento ( Buffer) y el segundo byte por el segundo fragmento chunk.toString('utf8')producirá caracteres incorrectos al final / principio del fragmento de texto. ¿Cómo puedo evitar esto?
Sugerencia: todavía necesito el búfer (más específicamente el número de bytes en el búfer) para limitar el número de bytes descargados. Por lo tanto, usar res.setEncoding('utf8')como en el primer código de ejemplo anterior para datos no comprimidos no se ajusta a mis necesidades.