如果我们有代理对,为什么选择UTF-32而不是UTF-16?

时间:2009-03-09 04:31:34

标签: unicode surrogate-pairs

如果我理解正确,UTF-32可以处理宇宙中的每个角色。因此可以通过使用代理对UTF-16。那么有没有什么好的理由使用UTF-32而不是UTF-16?

7 个答案:

答案 0 :(得分:9)

在UTF-32中,unicode字符总是由4个字节表示,因此解析代码比UTF-16字符串更容易编写,因为在UTF-16中,字符由不同的字节数表示。在缺点方面,UTF-32聊天器始终需要4个字节,如果您主要使用英语字符,那么这可能是浪费。所以它的设计选择取决于您的要求是使用UTF-16还是UTF-32。

答案 1 :(得分:8)

有人可能更愿意处理UTF-32而不是UTF-16,因为处理代理对几乎总是处理'特殊情况',并且必须处理这些特殊情况意味着你有可能出现错误的区域因为你不正确地处理它们(或者更可能只是忘记处理它们)。

如果UTF-32的内存使用量增加不是问题,那么降低复杂性可能足以让它选择它。

答案 2 :(得分:5)

答案 3 :(得分:3)

简答:不。

更长的答案:是的,与其他未获得备忘录的内容兼容。

不那么讽刺的答案:如果您更关心索引速度而不是空间使用速度,或者某种中间格式,或者对齐问题比缓存问题更重要的机器,或者......

答案 4 :(得分:3)

可能有一些很好的理由,但其中一个原因是加速索引/搜索,即在数据库等中。

使用UTF-32,您知道每个字符都是4个字节。使用UTF-16,您不知道任何特定字符的长度。

例如,您有一个返回字符串的第n个字符的函数:

char getChar(int index, String s );

如果您使用具有直接内存访问权限的语言进行编码,例如C,则在UTF-32中,此函数可能与某些指针算术(s+(4*index))一样简单,这将是一些O(1 )。

如果您使用的是UTF-16,那么您必须遍历字符串,然后解码,这将是O(n)。

答案 5 :(得分:2)

UTF-8也可以代表任何unicode角色!

如果您的文本主要是英文,您可以使用utf-8节省大量空间,但索引字符不是O(1),因为某些字符占用的不仅仅是一个字节

如果空间对你的情况不如速度那么重要,那么utf-32会更适合你,因为索引是O(1)

对于非英语文本,UTF-16可能比utf-8更好,因为在utf-8中你会遇到一些字符占用3个字节的情况,而在utf16中它们只占用两个字节。

答案 6 :(得分:2)

通常,您只需使用底层平台的字符串数据类型/编码,通常是(Windows,Java,Cocoa ...)UTF-16,有时是UTF-8或UTF-32。这主要是出于历史原因;三种Unicode编码之间几乎没有区别:这三种编码都是定义明确,快速且健壮的,并且所有这些编码都可以编码每个Unicode代码点序列。 UTF-32的独特功能是固定宽度编码(意味着每个代码点仅由一个代码单元表示)在实践中几乎没用:您的内存管理层需要知道代码的数量和宽度单位和用户对抽象字符和字素感兴趣。正如Unicode标准所提到的,Unicode应用程序无论如何都必须处理组合字符,连字等,并且代理对的处理尽管在概念上不同,但可以在同一技术框架内完成。

如果我要重塑这个世界,我可能会选择UTF-32,因为它只是最不复杂的编码,但是由于它的差异太小而无法实际考虑。