You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过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-0xD70xE0-0xFF,低字节任意(对应U+0800-U+D7FFU+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

火山引擎 最新活动