我遇到的情况是服务器可能会任意分解传输的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;
}
关于sockets - 如何检测字符串以UTF-8序列的中间结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586589/