在 UTF:s 之间转换,无需中间编码
Convert between UTF:s without intermediate encoding
是否可以在 UTF-8 和 UTF-16 之间转换而不先解码为 UCS-4,然后在不使用大映射的情况下对生成的代码点进行编码table?
我认为这个问题比评论所建议的更有趣:
UTF-8 -> UTF-16: UTF-16 一个字一个字写是不行的(如果一个字节一个字节写,我觉得要看UTF-16LE vs. 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 位)。
是否可以在 UTF-8 和 UTF-16 之间转换而不先解码为 UCS-4,然后在不使用大映射的情况下对生成的代码点进行编码table?
我认为这个问题比评论所建议的更有趣:
UTF-8 -> UTF-16: UTF-16 一个字一个字写是不行的(如果一个字节一个字节写,我觉得要看UTF-16LE vs. 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 位)。