【问题标题】:Detect partial or incomplete characters read from a buffer检测从缓冲区读取的部分或不完整字符
【发布时间】:2012-08-18 04:28:19
【问题描述】:

在一个循环中,我正在读取一个流,它被编码为 UTF-8,每个循环中 10 个字节(比如说)。由于首先将流传递到缓冲区,因此在将其转换为 UTF-8 字符串之前,我必须以字节为单位指定其读取长度。我面临的问题是,有时它会读取部分、不完整的字符。我需要解决这个问题。

有没有办法检测字符串是否以不完整的字符结尾,或者我可以对字符串的最后一个字符执行一些检查来确定这一点?

最好是“非单一编码”解决方案。

【问题讨论】:

    标签: node.js character-encoding buffer


    【解决方案1】:

    如果缓冲区以不完整的字符结尾,并且您将其转换为字符串,然后从该字符串初始化新缓冲区,则新缓冲区的长度将不同(如果您使用的是 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); 然后行总是以完整的字符结束。问候。
    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多