为什么UTF-32存在而每个字符只需要21位?

时间:2011-06-14 06:15:07

标签: unicode encoding

我们知道代码点可以在0..10FFFF的这个区间内,小于2 ^ 21。那么为什么我们需要UTF-32才能用3个字节表示所有代码点? UTF-24应该足够了。

5 个答案:

答案 0 :(得分:21)

我能想到的两个原因:

  • 允许未来扩展
  • (更重要的是)计算机通常在处理4字节边界上的数据方面要好得多。与使用3字节边界的痛苦相比,减少内存消耗的好处相对较小。

我想这有点像问我们为什么经常有8位,16位,32位和64位整数数据类型(字节,整数,长整数等)但不是24位整数数据类型。我确信在很多场合我们都知道数字永远不会超过2 21 ,但使用int比创建24位类型更简单。< / p>

答案 1 :(得分:3)

首先有2种字符编码方案:UCS-4将每个字符编码为32位,作为无符号整数,范围为0x00000000 - 0x7FFFFFFF,UCS-2使用16位用于每个代码点。

后来发现只使用UCS-2的65536个代码点会导致一个问题,但许多程序(Windows, cough )依赖于16位宽的宽字符,所以UTF-16已创建。 UTF-16通常会对值U+0000 - U+FFFF进行编码;和U+10000 - U+10FFFF使用代理项对,即一对两个16位值。

由于这有点复杂,因此引入了UTF-32,作为U+FFFF之外的字符的简单一对一映射。现在,由于UTF-16只能 编码到U+10FFFF,因此决定这将是将分配的最大值,因此不会出现进一步的兼容性问题,所以UTF-32确实只使用了21位。作为额外的奖励,UTF-8最初计划为1-6字节编码,现在每个代码点不需要超过4个字节。因此,可以很容易地证明它从不需要比UTF-32更多的存储空间。

假设 UTF-24 格式确实可以节省内存。然而,无论如何它的节省都是可疑的,因为除了表情符号或类似的爆炸之外,它主要消耗比UTF-8更多的存储空间 - 并且没有很多有趣的文本只包括表情符号。

但是,UTF-32用作需要对代码点进行简单索引访问的程序中文本的内存表示 - 它是唯一编码,其中C数组中的第N个元素是第N个代码点 - UTF-24也会做同样的事情,节省25%的内存,但更复杂的元素访问。

答案 2 :(得分:2)

确实只需要21位(reference),但是现代计算机擅长移动32位单元并且通常与它们交互。我不认为我曾经使用过具有24位整数或字符类型的编程语言,也不会使用处理器字长的倍数的平台(不是因为我上次使用的是8位计算机; UTF -24在8位机器上是合理的,但自然也有一些。

答案 3 :(得分:1)

UTF-32是16位的倍数。使用32位数量比使用24位数量更常见,通常更好地支持。它还有助于保持每个字符4字节对齐(假设整个字符串是4字节对齐)。从1个字节到2个字节到4个字节是最“逻辑”的游行。

除此之外:Unicode标准不断增长。最终可以分配该范围之外的代码点(在不久的将来,由于仍有大量未分配的代码点,因此可能不太可能)。

答案 4 :(得分:0)

UTF-24没有附加值。

  • 如果空间很重要,那么UTF-8可以将所有现有的unicode字符(0 ... 0x10FFFF)编码为相同或更少的3个字节(大多数情况下需要少于3个字节)。因此,UTF-8比UTF-24更紧凑。

  • 如果空间无关紧要,则UTF-32的速度要比UTF-24快,因为计算机可以更好地处理2次幂对齐的数据。