Я хочу сделать 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')
, как в первом примере кода выше для несжатых данных, не соответствует моим потребностям.