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