Chcę złożyć żądanie HTTP za pomocą node.js, aby załadować tekst z serwera WWW. Ponieważ odpowiedź może zawierać dużo tekstu (niektóre megabajty), chcę przetwarzać każdy fragment tekstu osobno. Mogę to osiągnąć za pomocą następującego kodu:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
To wydaje się działać bez problemów. Jednak chcę obsługiwać kompresję HTTP, więc używam 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
});
Może to stanowić problem dla znaków wielobajtowych, takich jak '\u00c4'który składa się z dwóch bajtów: 0xC3i 0x84. Jeśli pierwszy bajt jest objęty pierwszą porcją ( Buffer), a drugi bajt drugą porcją, wówczas chunk.toString('utf8')na końcu / początku fragmentu tekstu pojawią się niepoprawne znaki. Jak mogę tego uniknąć?
Wskazówka: Nadal potrzebuję bufora (a dokładniej liczby bajtów w buforze), aby ograniczyć liczbę pobranych bajtów. Zatem użycie res.setEncoding('utf8')kodu jak w pierwszym przykładzie powyżej dla nieskompresowanych danych nie odpowiada moim potrzebom.