一尘不染

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

algorithm

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

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

具体来说,我想知道是否存在一些捷径,可以在不将UTF-8序列完全转换为代码点的情况下何时需要一个代理对。

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


阅读 303

收藏
2020-07-28

共1个答案

一尘不染

效率始终是速度与尺寸之间的权衡。如果速度优先于大小,那么最有效的方法就是根据源字符串的长度进行猜测。

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

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

最糟糕的情况是扩展因子是将U + 0000-U +
007f从utf8转换为utf16时:按字节缓冲区的大小只必须是源字符串的两倍。将其他Unicode代码点编码为utf16或utf8时,其大小相等或字节分配较小。

2020-07-28