检测从缓冲区读取的部分或不完整字符

3
在循环中,我正在读取一个以UTF-8编码的流,在每个循环中读取10个字节。由于该流首先传递到缓冲区中,因此在将其转换为UTF-8字符串之前,必须指定其读取长度(以字节为单位)。我面临的问题是有时它会读取部分不完整的字符。我需要解决这个问题。
有没有一种方法可以检测字符串是否以不完整的字符结尾,或者可以对字符串的最后一个字符执行某些检查来确定这一点?
最好是“非单一编码”的解决方案。
1个回答

0
如果一个缓冲区以不完整的字符结尾,并且您将其转换为字符串,然后从该字符串初始化一个新缓冲区,则新缓冲区的长度将与原始缓冲区不同(如果使用utf8,则更长,如果使用ucs2,则更短)。
类似于以下内容:
var b1=new Buffer(buf.toString('utf8'), 'utf8');
if (b2.length !== buf.length) {
   // buffer has an incomplete character
} else {
   // buffer is OK
}

替换您所需的编码为'utf8'。

请注意,这取决于当前实现的Buffer#toString如何处理不完整的字符,这并没有记录在案,尽管它不太可能以导致等长缓冲区的方式进行更改(未来的实现可能会抛出错误,因此您应该在try-catch块中包装代码)。


谢谢你的回答,尽管我已经找到了一个类似的解决方案。 缓存区长度为24字节,但我总是只读取16个字节,然后执行以下操作: var bytesRead = (bytesRead < bufferSafe)? bytesRead: bufferSafe, line = buf.toString(encoding, 0, bytesRead); while (Buffer.byteLength(line) != bytesRead) line = buf.toString(encoding, 0, ++bytesRead); 这样,行就总会以完整的字符结尾。问候。 - user1598585

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接