Sockets 如何检测字符串在UTF-8序列的中间结束? 我有这样一种情况,服务器可以任意分解传输的UTF-8字符串数据,包括在UTF-8序列的中间。在websocket代理中,在数据发送到客户机之前接收该数据,我想检测这种情况,让代理等待来自服务器的下一个数据包,并在发送到客户机之前将其与前一个数据包连接起来 假设我把服务器上的数据看作一个简单的字节数组,我可以用什么最简单的逻辑来可靠地检测那些字节在UTF-8序列中间结束的情况? < P>这是我使用的逻辑(在JavaScript中): 函数不完整utf8(buf){ 对于(var ix=Math.max(buf.length-6,0);ix

Sockets 如何检测字符串在UTF-8序列的中间结束? 我有这样一种情况,服务器可以任意分解传输的UTF-8字符串数据,包括在UTF-8序列的中间。在websocket代理中,在数据发送到客户机之前接收该数据,我想检测这种情况,让代理等待来自服务器的下一个数据包,并在发送到客户机之前将其与前一个数据包连接起来 假设我把服务器上的数据看作一个简单的字节数组,我可以用什么最简单的逻辑来可靠地检测那些字节在UTF-8序列中间结束的情况? < P>这是我使用的逻辑(在JavaScript中): 函数不完整utf8(buf){ 对于(var ix=Math.max(buf.length-6,0);ix,sockets,unicode,utf-8,language-agnostic,websocket,Sockets,Unicode,Utf 8,Language Agnostic,Websocket,您所需要做的就是使用UTF-8扫描仪处理接收到的字节,该扫描仪处理字节的推送,而不是尝试读取(拉取)字节。您依次将每个接收到的字节推送到扫描仪。每次完成对编码字符的处理时,它都会将该字符推向下游。如有必要,它会保留一小部分尚未完全编码字符的字节缓冲区 如果这样做,当扫描程序缓冲区包含一个推送字节时,代码将进入等待状态。请查看UTF-8定义。起始字节不同于继续字节,并对随后的继续字节数进行编码。因此,您可以轻松确定最后一个代码点是否完整。如果你想考虑字形、单词或句子,它会变得更复杂。为什么当你拥有

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


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

请查看UTF-8定义。起始字节不同于继续字节,并对随后的继续字节数进行编码。因此,您可以轻松确定最后一个代码点是否完整。如果你想考虑字形、单词或句子,它会变得更复杂。为什么当你拥有(WebSoCK)帧长度时,你想检测可能的UTF8解码问题吗?您应该能够简单地等待,直到看到整个帧,然后将其转发给客户端。@PavelBuckek:我是用套接字而不是websocket与服务器通信的。websocket代理的目的是向客户端提供websocket。
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;
}