我有一种情况,我需要逐行处理流中的一些数据。问题是事先不知道数据的编码;它可能是UTF-8
或任何遗留的单字节编码(例如Latin1
,ISO-8859-5
等)。它不会是UTF16
或像EBCDIC
,所以我可以合理地期望\n
它是明确的,所以理论上我可以将它分成几行。在某些时候,当我遇到空行时,我需要将流的其余部分提供给其他地方(不将其拆分成行,但仍然没有任何重新编码);考虑 HTTP 样式的标头,后跟不透明的主体。
这是我得到的:
function processStream(stream) {
var buffer = '';
function splitLines(data) {
buffer += data;
var lf = buffer.indexOf('\n');
while (lf >= 0) {
var line = buffer.substr(0, lf - 1);
buffer = buffer.substr(lf + 1);
this.emit('line', line);
lf = buffer.indexOf('\n');
}
}
function processHeader(line) {
if (line.length) {
// do something with the line
} else {
// end of headers, stop splitting lines and start processing the body
this
.removeListener('data', splitLines)
.removeAllListeners('line')
.on('data', processBody);
if (buffer.length) {
// process leftover buffer as part of the body
processBody(buffer);
buffer = '';
}
}
}
function processBody(data) {
// do something with the body chunks
}
stream.setEncoding('binary');
stream
.on('data', splitLines)
.on('line', processHeader);
}
它可以完成工作,但问题是binary
编码已被弃用,并且将来可能会消失,让我没有那个选择。Buffer
如果(很可能,何时)与编码不匹配,所有其他编码要么破坏数据,要么无法完全解码。相反,使用Uint8Array
JavaScript 将意味着缓慢且不方便的 Javascript 循环数据只是为了找到换行符。
关于如何在不使用编码的情况下将流分割成行,同时保持编码不可知的任何建议binary
?