首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从/到UTF-8/UTF-16的转换需要(例如: utf8 ->码点,然后码点到utf16)或(例如: utf8 -> utf16)?

从/到UTF-8/UTF-16的转换需要(例如: utf8 ->码点,然后码点到utf16)或(例如: utf8 -> utf16)?
EN

Stack Overflow用户
提问于 2020-06-15 10:18:31
回答 4查看 305关注 0票数 0

我有一个关于从utf8/utf16转换的查询,确实需要将UTF-8/16首先返回到它的原始码点,然后转换为目标编码,或者可以直接从编码转换为另一种编码,例如: utf16到utf8或visa。

例如,我有一个字符س它的UTF-8 0xD8 0xB3,确实需要从utf-8到utf-16转换,以解码到它的代码点U+0633,然后再次编码为UTF-16 0x0633

EN

回答 4

Stack Overflow用户

发布于 2020-06-15 12:37:55

如果您的UTF-8代码小于128,那么您可以立即生成UTF-16等效码。但是,在非常实际的意义上,您已经将整个UTF-8字符解码为它的码点,并将其重新编码为UTF-16。所以我们只是在讨论语义,关于这是否会直接进入另一种编码。

最多三个字节的UTF-8编码必须完全解码,而UTF-16编码就是两个字节的解码值。那么,您是否真的将其重新编码为UTF-16,或者直接转换为UTF-16?这实际上只是一种观点。

最复杂的版本是当UTF-8编码是四个字节时,因为这些编码表示BMP之外的代码点,所以UTF-16编码将是一个代理对。我不认为有任何计算上的捷径可走。如果有的话,可能就不值得了。这样的捷径实际上可能会在现代处理器上运行得更慢,因为你需要额外的条件分支指令,这可能会阻碍分支预测和流水线。

我认为你也可以在相反的方向上提出大致相同的论点。

所以我要说,是的,当在UTF-8和UTF-16之间进行代码转换时,您必须转换到实际的码点。

票数 0
EN

Stack Overflow用户

发布于 2020-06-15 23:47:20

UTF-8的解码算法是这样工作的。您对第一个字节执行最多3个条件测试,以确定要处理的字节数,然后将该字节数处理为一个代码点。

UTF-16的编码算法通过获取代码点并检查它是否大于0xFFFF来工作。如果是,则将其编码为2个16位代理项对;否则,将其编码为单个16位代码单元。

但事情是这样的。大于0xFFFF的每个码点以4个码单元以UTF-8编码,而每个0xFFFF或更小的码点由3个或更小的码单元编码。因此,如果您使用UTF-8解码来生成码点...您不必在UTF-16编码算法中执行条件测试。根据您解码UTF-8序列的方式,您已经知道码点是否需要1个或2个16位代码单元。

因此,在理论上,完整的UTF-8->utf-16手工编码算法可能比使用直接码点中间件涉及的条件测试少一次。但实际上,这是唯一的区别。即使对于4字节的UTF-8序列,在进行代理对编码之前,也必须将UTF-8值提取到一个完整的32位码点中。因此,唯一可能的实际效率增益是条件的缺乏。

对于UTF-16->UTF-8,您知道在UTF-8中任何代理项对编码都需要4个字节,任何非代理项对编码都需要3个或更少字节。无论如何,在解码UTF-16之前,你必须做这个测试。但是,在UTF-8编码器可以执行其工作之前,您基本上仍然必须完成将UTF-16转换为码点的所有工作(即使这项工作什么都不做,就像非代理对的情况一样)。因此,唯一的效率提升是因为失去了一个条件测试。

这些听起来像是微优化。如果你做了很多这样的转换,而且它们是性能关键型的,那么手工编写一个转换器可能是值得的。也许吧。

票数 0
EN

Stack Overflow用户

发布于 2020-06-15 10:33:18

尝试这个问题的最高答案:

How to convert UTF-8 std::string to UTF-16 std::wstring?

忽略"C++11“应答,因为进行的STL调用已被弃用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62380360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档