Я хочу сделать HTTP-запрос, используя node.js для загрузки текста с веб-сервера. Поскольку ответ может содержать много текста (несколько мегабайт), я хочу обрабатывать каждый фрагмент текста отдельно. Я могу добиться этого, используя следующий код:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Кажется, это работает без проблем. Однако я хочу поддерживать HTTP-сжатие, поэтому я использую 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
});
Это может быть проблемой для многобайтовых символов, например, '\u00c4'состоящих из двух байтов: 0xC3и 0x84. Если первый байт покрыт первым чанком ( Buffer), а второй байт вторым чанком, то chunk.toString('utf8')в конце / начале текстового чанка появятся неправильные символы. Как я могу избежать этого?
Подсказка: мне все еще нужен буфер (точнее количество байтов в буфере), чтобы ограничить количество загружаемых байтов. Поэтому использование, res.setEncoding('utf8')как в первом примере кода выше для несжатых данных, не соответствует моим потребностям.