我想使用node.js进行HTTP请求,以从Web服务器加载一些文本。由于响应可能包含很多文本(有些兆字节),因此我想分别处理每个文本块。我可以使用以下代码来实现:
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')
,在上面的第一个示例代码中使用like来处理非压缩数据不符合我的需求。