如何通过UTF-16LE字节序列计算对应码点的UTF-8字节长度?
如何通过UTF-16LE字节直接计算对应UTF-8的字节长度
可以直接通过分析UTF-16LE的字节值范围来计算对应的UTF-8字节数,完全不需要先转换成UTF-8再统计长度,下面是具体的判断逻辑:
核心逻辑依据
因为你的输入是有效的UTF-16LE数组,所以可以直接基于UTF-16的编码规则,先识别每个Unicode码点的类型,再对应到UTF-8的字节数:
1. 处理单码元字符(非代理对)
UTF-16LE里单码元占2字节(低字节在前,高字节在后),通过高字节和低字节的范围就能判断对应的UTF-8长度:
- UTF-8占1字节:高字节为
0x00,且低字节在0x00-0x7F(对应Unicode码点U+0000-U+007F) - UTF-8占2字节:满足以下任一条件:
- 高字节是
0x00,且低字节在0x80-0xFF(对应U+0080-U+00FF) - 高字节在
0x01-0x07,低字节任意(对应U+0100-U+07FF)
- 高字节是
- UTF-8占3字节:满足以下任一条件:
- 高字节在
0x08-0xD7或0xE0-0xFF,低字节任意(对应U+0800-U+D7FF、U+E000-U+FFFF) - 高字节是
0x07,且低字节在0x80-0xFF(对应U+0780-U+07FF)
- 高字节在
2. 处理代理对(对应4字节Unicode码点)
UTF-16LE的代理对占4字节:前2字节是低代理(高字节范围0xD8-0xDB),后2字节是高代理(高字节范围0xDC-0xDF)。这类代理对对应的Unicode码点是U+10000-U+10FFFF,转换为UTF-8固定占4字节。
实际计算流程
遍历UTF-16LE字节数组时:
- 取当前位置的2字节,检查高字节是否在
0xD8-0xDB:- 如果是:说明这是代理对的前半部分,直接跳过接下来的2字节,给UTF-8长度加4
- 如果不是:根据上面单码元的规则判断该字符对应UTF-8的字节数(1/2/3),加到长度后,跳过当前2字节
这种方式全程只做字节值的范围判断,不需要解析完整的Unicode码点或生成UTF-8字节,效率很高。
内容的提问来源于stack exchange,提问作者Adamarla




