【问题标题】:Convert between UTF:s without intermediate encoding在没有中间编码的 UTF:s 之间转换
【发布时间】:2015-05-06 18:16:23
【问题描述】:

是否可以在不首先解码为 UCS-4 的情况下在 UTF-8 和 UTF-16 之间进行转换,然后对生成的代码点进行编码,而不使用大型映射表?

【问题讨论】:

  • @CrApHeR 我要一个算法。 UTF-8 编码值也可以使用 4 个字节...
  • 一般来说,如果你有需要的映射表,你可以直接将任何编码转换为任何编码。由于在每个单独的编码配对之间创建单独的映射表是指数级的并且几乎没有意义,因此正在使用一个标准中介。所以回答你的问题:是的,这是可能的。是否有人已经完成了必要的工作,这在某种程度上超出了 SO 的范围。
  • @CrApHeR:两者都是可变长度编码。位宽仅针对每个编码单元。
  • 再说一次,我不知道是否有人真正完成了这方面的工作。在最坏的情况下,您可以将 UTF-16→UCS-4→UTF-8 位摆弄步骤作为一种算法实现,然后通过优化算法在数学上减少所需的步骤。
  • 为什么要跳过中间表示?您是否正在尝试减少内存使用或提高速度?还有什么?

标签: algorithm language-agnostic utf


【解决方案1】:

我认为这个问题比 cmets 建议的更有趣:

  • UTF-8 -> UTF-16:如果逐字编写 UTF-16 是不可能的(如果逐字节编写,我认为这取决于 UTF-16LE 与 UTF-16BE)。 UTF-8 编码 7 位 1 字节、11 位 2 字节(5/6 位)、16 位 3 字节(4/6/6 位)和 21 位 4 字节(3/6/6/6) .唯一有趣的情况是您读取超过 16 位,超过第一个 UTF-16 字,即 21 位。不幸的是,前四个 UTF-8 字节仅包含 15 位 (3 + 6 + 6),因此在读取所有四个字节之前,您无法写入第一个 UTF-16 字。所以先解码到UCS-4没有区别。

  • UTF-16 -> UTF-8:读完第一个字就知道自己是否在0xffff以上,这种情况下得到前11位和总位数,就知道多了大于 16。因此,在这种情况下,您已经可以写入前两个 UTF-8 字节(3+6=9 位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多