sockets - 如何检测字符串以UTF-8序列的中间结尾?

标签 sockets unicode utf-8 language-agnostic websocket

我遇到的情况是服务器可能会任意分解传输的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/

相关文章:

c - 消息发送,接收者未收到消息。套接字编程

c - 处理坏文件描述符错误的方法

javascript - 获取字符串中的中文标点符号

导入时的postgresql和排序规则问题

c# - 从 C# Windows 应用程序中的 PHP 页面获取 utf8 字符串

Node.js + Socket.io + Redis 应用程序通过 PM2,内存占用较大

C++ UDP 服务器在获取客户端地址配置时发送消息

unicode - 如何将小端 UTF-16 unicode 转换为 erlang 字符串

c - C中字节的Unicode代码点流?

vim - 如何将非 ASCII 字符粘贴到 vim 中?