Tôi muốn tạo một yêu cầu HTTP bằng cách sử dụng node.js để tải một số văn bản từ máy chủ web. Vì phản hồi có thể chứa nhiều văn bản (một số Megabyte) nên tôi muốn xử lý từng đoạn văn bản riêng biệt. Tôi có thể đạt được điều này bằng cách sử dụng mã sau đây:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Điều này dường như làm việc mà không có vấn đề. Tuy nhiên tôi muốn hỗ trợ nén HTTP, vì vậy tôi sử dụng 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
});
Đây có thể là một vấn đề đối với các ký tự nhiều byte như '\u00c4'bao gồm hai byte: 0xC3và 0x84. Nếu byte đầu tiên được bao phủ bởi đoạn đầu tiên ( Buffer) và byte thứ hai bởi đoạn thứ hai thì chunk.toString('utf8')sẽ tạo ra các ký tự không chính xác ở cuối / đầu đoạn văn bản. Làm thế nào tôi có thể tránh điều này?
Gợi ý: Tôi vẫn cần bộ đệm (cụ thể hơn là số byte trong bộ đệm) để giới hạn số byte được tải xuống. Vì vậy, sử dụng res.setEncoding('utf8')like trong mã ví dụ đầu tiên ở trên cho dữ liệu không nén không phù hợp với nhu cầu của tôi.