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