Ich möchte eine HTTP-Anfrage mit node.js stellen, um Text von einem Webserver zu laden. Da die Antwort viel Text (einige Megabyte) enthalten kann, möchte ich jeden Textblock separat verarbeiten. Ich kann dies mit dem folgenden Code erreichen:
var req = http.request(reqOptions, function(res) {
...
res.setEncoding('utf8');
res.on('data', function(textChunk) {
// process utf8 text chunk
});
});
Dies scheint ohne Probleme zu funktionieren. Ich möchte jedoch die HTTP-Komprimierung unterstützen, daher verwende ich 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
});
Dies kann ein Problem für Multi-Byte-Zeichen sein, '\u00c4'
die aus zwei Bytes bestehen: 0xC3
und 0x84
. Wenn das erste Byte vom ersten Block ( Buffer
) und das zweite Byte vom zweiten Block abgedeckt chunk.toString('utf8')
wird, werden am Ende / Anfang des Textblocks falsche Zeichen erzeugt. Wie kann ich das vermeiden?
Hinweis: Ich benötige immer noch den Puffer (genauer gesagt die Anzahl der Bytes im Puffer), um die Anzahl der heruntergeladenen Bytes zu begrenzen. Die Verwendung res.setEncoding('utf8')
des Codes wie im ersten Beispiel oben für nicht komprimierte Daten entspricht also nicht meinen Anforderungen.
chunk.toString('utf8')
funktioniert nicht immer wegen Multi-Byte-Zeichen in UTF8. Ich verstehe nicht, warum Sie meine Antwort geändert haben, die dieses Problem explizit durch die Verwendung von a überwindetStringDecoder
. Vermisse ich hier etwas Hatnode
sich etwas geändert?toString
.quelle