如果我理解正确,UTF-32可以处理宇宙中的每个角色.因此可以通过使用代理对UTF-16.那么使用UTF-32而不是UTF-16有什么好的理由吗?
在UTF-32中,unicode字符总是由4个字节表示,因此解析代码比UTF-16字符串更容易编写,因为在UTF-16中,字符由不同的字节数表示.在缺点方面,UTF-32聊天器总是需要4个字节,如果你主要使用说英语字符,这可能是浪费.所以它的设计选择取决于您的要求是使用UTF-16还是UTF-32.
有人可能更喜欢处理UTF-32而不是UTF-16,因为处理代理对几乎总是处理'特殊情况',并且必须处理这些特殊情况意味着你有一些区域可能会因为你的交易而陷入错误与他们错误(或更可能只是忘记处理他们).
如果增加UTF-32的内存使用量不是问题,那么降低复杂性可能足以选择它.
这也是Unicode联盟的一个很好的文档。
UTF-32,UTF-16和UTF-8优势的比较
版权所有©1991–2009 Unicode,Inc.。Unicode标准,版本5.2
从表面上看,对于内部处理代码,UTF-32似乎是Unicode编码形式的明显选择,因为它是固定宽度的编码形式。它可以一致地绑定到C和C ++
wchar_t
,这意味着此类编程语言可以提供内置的支持和现成的字符串API,程序员可以利用它们。但是,UTF-16具有许多抵消优势,可能会使实现者选择它作为内部处理代码。尽管所有三种编码形式每个字符最多需要4个字节(或32位)的数据,但实际上,在几乎所有情况下,用于真实数据集的UTF-32都占用UTF-16所需存储空间的两倍。因此,一种常见的策略是让内部字符串存储使用UTF-16或UTF-8,但在处理单个字符时使用UTF-32。UTF-32与UTF-16。平均而言,所有UTF-16数据中有99%以上是使用单个代码单元表示的。这几乎包括软件需要对文本进行特殊操作才能处理的所有典型字符,例如格式控制字符。结果,大多数文本扫描操作根本不需要解压缩UTF-16代理对,而是可以安全地将它们视为字符串的不透明部分。对于许多操作而言,UTF-16与UTF-32一样易于处理,并且UTF-16作为处理代码的性能往往会很好。UTF-16是大多数支持Unicode的实现的首选内部处理代码。除了用于Unix平台外,UTF-16提供了紧凑大小的正确组合,并具有处理BMP之外的偶发字符的能力。在简化软件编码设计和维护方面,UTF-32具有一些优势。因为字符处理是固定宽度的,所以UTF-32处理不需要维护软件中的分支来测试和处理UTF-16补充字符所需的双代码单元元素。相反,大表中的32位索引并不是特别有效的内存。为避免此类索引占用大量内存,通常将Unicode表作为多级表处理(请参见第5.1节“转换为其他标准”中的“多级表”)。在这种情况下,会将32位代码点值切成较小的范围,以允许分段访问表。即使在典型的UTF-32实现中也是如此。对于相同的数据,UTF-32作为处理代码的性能实际上可能比UTF-16的性能差,因为额外的内存开销意味着将更频繁地超过缓存限制,并且内存分页将更频繁地发生。对于具有对16位对齐访问施加惩罚但具有很大内存的处理器设计的系统,这种影响可能不太明显。无论如何,Unicode代码点不一定与用户对“字符”的期望相符。例如,以下代码不是由单个代码点表示的:组合字符序列,如;;朝鲜语的连贯字母顺序;或Devanagari连词“ ksha”。因为某些Unicode文本处理必须了解并处理诸如文本元素之类的字符序列,UTF-32的固定宽度编码形式的优势在一定程度上被处理文本元素的固有可变宽度特性所抵消。有关示例,其中通用实现的过程由于用户期望“字符”的身份而处理固有可变宽度的文本元素,请参见Unicode技术标准#18,“ Unicode正则表达式”。就使用的字节数而言,UTF-8相当紧凑。当用于诸如中文,日文和韩文的东亚实现时,这实际上仅在大小上有很大的劣势,它们使用汉字表意文字或韩文音节,要求在UTF-8中使用三字节代码单元序列。在处理方面,UTF-8的效率也明显低于其他编码形式。二进制排序。UTF-8字符串的二进制排序方式与Unicode代码点的二进制排序方式相同。显然,这与二进制类型的UTF-32字符串的顺序相同。
总体结构
当仅处理BMP字符(在U + 0000..U + FFFF范围内)时,对于二进制字符串比较或字符串排序,所有这三种编码形式均给出相同的结果。但是,在处理补充字符(范围为U + 10000..U + 10FFFF)时,UTF-16二进制顺序与Unicode代码点顺序不匹配。尝试与二进制排序列表进行互操作时,例如在UTF-16系统与UTF-8或UTF-32系统之间,这可能导致复杂化。但是,对于根据特定语言或区域设置而不是使用二进制顺序进行排序的数据,无论其编码形式如何,数据的排序顺序都相同。