如何检测字符串是否在 UTF-8 序列的中间结束



我遇到一种情况,服务器可能会任意分解传输的 UTF-8 字符串数据,包括在 UTF-8 序列的中间。 在接收此数据之前将其发送到客户端的 websocket 代理中,我想检测这种情况,并让代理等待来自服务器的下一个数据包,并在发送到客户端之前将其与前一个数据包连接起来。

假设我将来自服务器的数据视为一个简单的字节数组,那么我可以使用什么最简单的逻辑来可靠地检测这些字节在 UTF-8 序列中间结束的情况?

这是我最终使用的逻辑(在 JavaScript 中(:

function incompleteUTF8(buf) {
    for(var ix = Math.max(buf.length - 6, 0); ix < buf.length; ix++) {
        var ch = buf[ix];
        if(ch < 0x80)
            continue;
        if((ch & 0xe0) === 0xc0)
            ix++;
        else if((ch & 0xf0) === 0xe0)
            ix += 2;
        else if((ch & 0xf8) === 0xf0)
            ix += 3;
        else if((ch & 0xfc) === 0xf8)
            ix += 4;
        else if((ch & 0xfe) === 0xfc)
            ix += 5;
        else
            continue;
        if(ix >= buf.length)
            return true;
    }
    return false;
}

您需要做的就是使用 UTF-8 扫描程序处理您收到的字节,该扫描程序处理向其推送字节,而不是尝试读取(拉取(字节。将每个接收到的字节依次推送到扫描程序。每次完成对编码字符的处理时,它都会将该字符推向下游。如有必要,它会维护一个小的字节缓冲区,这些字节还不是完全编码字符的一部分。

如果这样做,当扫描程序缓冲区包含推送的字节时,代码将进入等待状态。

相关内容

  • 没有找到相关文章

最新更新