C:确定UTF-8字符串中UTF-16字符串需要多少字节的最有效方法

hip*_*ail 6 c algorithm utf-8 utf-16 unicode-string

我已经看到一些非常聪明的代码用于在Unicode代码点和UTF-8之间进行转换,所以我想知道是否有人(或者会喜欢设计)这个.

  • 给定UTF-8字符串,相同字符串的UTF-16编码需要多少字节.
  • 假设UTF-8字符串已经过验证.它没有BOM,没有超长序列,没有无效序列,是空终止的.它不是CESU-8.
  • 必须支持带代理的完整UTF-16.

具体来说,我想知道是否有快捷方式可以在不完全将UTF-8序列转换为代码点的情况下知道何时需要代理对.

我见过的最好的UTF-8代码点代码使用了矢量化技术,所以我想知道这是否也可以.

Chr*_*cke 5

效率始终是速度与尺寸的权衡.如果速度比尺寸更受青睐,那么最有效的方法就是根据源字符串的长度进行猜测.

有4种情况需要考虑,只需将最坏情况作为最终缓冲区大小:

  • U + 0000-U + 007F - 将在utf8中编码为1字节,在utf16中编码为每字符2字节.(1:2 = x2)
  • U + 0080-U + 07FF - 编码为2byte utf8序列,或每字符2字节utf16个字符.(2:2 = x1)
  • U + 0800-U + FFFF - 存储为3byte utf8序列,但仍然适合单个utf16字符.(3:2 = x.67)
  • U + 10000-U + 10FFFF - 存储为4byte utf8序列或utf16中的代理对.(4:4 = x1)

更糟糕的情况扩展因子是将U + 0000-U + 007f从utf8转换为utf16时:缓冲区(字节方式)只需要是源字符串的两倍.当编码为utf16为utf8时,每个其他unicode代码点都会产生相同的大小或更小的字节分配.