我遇到一种情况,服务器可能会任意分解传输的 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 扫描程序处理您收到的字节,该扫描程序处理向其推送字节,而不是尝试读取(拉取(字节。将每个接收到的字节依次推送到扫描程序。每次完成对编码字符的处理时,它都会将该字符推向下游。如有必要,它会维护一个小的字节缓冲区,这些字节还不是完全编码字符的一部分。
如果这样做,当扫描程序缓冲区包含推送的字节时,代码将进入等待状态。