有大量关于 Unicode 代码单元、代码点等的信息,但我仍然对使用字节流(libiconv要求)转换组合字符、字素等有点模糊。
目前我只对使用 libconv's 在 UTF-8/UTF-16/UTF-32 之间转换感兴趣iconv()
,它期望源缓冲区和目标缓冲区的字节长度作为参数。
问题:是否有一种安全的方法可以根据源缓冲区的已知字节长度快速计算目标缓冲区的最大可能字节长度?
比方说,例如,从已知转换u16buf
为(不包括 0x0000-termination,如果有的话)。在最坏的情况下,UTF-16 源缓冲区中每个代码点将有 1 个两字节单元,对应于 UTF-8 目标缓冲区中每个代码点有 4 个单字节单元。这足以安全地假设 UTF-8 目标缓冲区永远不会长于吗?u8buf
u16byteslen
2 * u16lenbytes
我实际上已经对此进行了试验并且似乎可以工作,但是我不确定我是否缺少涉及组合字符和字素簇的极端案例。我的怀疑来自于我对这些东西如何在这 3 种不同的编码之间进行转换的无知。我的意思是,一个字形是否可能需要说 3 个 UTF-16 代码点,但在转换时需要 10 个 UTF-8 代码点?
在那种情况下,翻倍u16lenbytes
是不够的,对吧?如果是这样,是否有任何其他直接的方法来预先计算目标缓冲区的最大长度?