Bir web sunucusundan bazı metin yüklemek için node.js kullanarak bir HTTP isteği yapmak istiyorum. Yanıt çok fazla metin içerebileceğinden (bazı Megabayt) Her metin yığınını ayrı ayrı işlemek istiyorum. Aşağıdaki kodu kullanarak bunu elde edebilirsiniz:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Bu sorunsuz çalışıyor gibi görünüyor. Ancak HTTP sıkıştırmasını desteklemek istiyorum, bu yüzden zlib kullanıyorum:
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
});
Bu, '\u00c4'iki bayttan oluşan çok baytlı karakterler için bir sorun olabilir : 0xC3ve 0x84. İlk bayt birinci yığın ( Buffer) ve ikinci bayt ikinci yığın tarafından kaplanıyorsa chunk.toString('utf8'), metin yığınının sonunda / başında yanlış karakterler oluşturur. Bundan nasıl kaçınabilirim?
İpucu: İndirilen bayt sayısını sınırlamak için yine de arabelleğe (daha özel olarak tampondaki bayt sayısı) ihtiyacım var. Yani res.setEncoding('utf8')sıkıştırılmamış veriler için yukarıdaki ilk örnek kodda olduğu gibi kullanmak benim ihtiyaçlarına uygun değil.