对UTF-16和UTF-32的困惑

时间:2014-05-29 13:21:18

标签: memory unicode encoding utf

据我所知,UTF-16和UTF-32之间的主要区别在于UTF-32每个字符总是四个字节,而UTF-16有时是一个字节,有时每个字符有两个字节。这使得UTF-16的优势在于占用的内存比UTF-32少,但UTF-32具有第n个角色可以持续访问的优势。

我的问题是,如果你能用UTF-16中最多两个字节来表示每个unicode字符,那么为什么不存在总是使用两个字节来编码每个字符的格式呢?这种格式虽然比UTF-16稍贵一些内存,但通过在使用一半内存时允许恒定时间访问,将严格优于UTF-32。

我的误会是什么?

3 个答案:

答案 0 :(得分:5)

你有点不对劲:

  1. Unicode定义值(代码点)最多为0x110000,即2 21 。一旦达到0x10FFFF,就需要新的编码方案,但是有大量未使用的代码点,因此在达到该限制之前,Unicode在可预见的未来有足够的空间进行扩展。

  2. UTF-32使用32位代码单元。由于当前定义的每个代码点都小于0x10FFFF,因此每个代码点都适合1个代码单元。

  3. UTF-16使用16位代码单元。其编码方案对于低于0x10000的代码点使用1个代码单元,对剩余代码点使用两个代码单元(称为代理对)。 UTF-16设计用于编码高达0x10FFFF的代码点。

  4. UTF-8使用8位代码单元。其编码方案使用1-4个代码单元之间的任意值来表示代码点,具体取决于其值。原始编码方案用于允许最多6个代码单元,代码点高达0x7FFFFFFF,但后来限制为4个代码单元,因此高于0x10FFFF的代码点(UTF-16中无法表示)在UTF-8中是非法的允许UTF-8和UTF-16之间的无损转换。

答案 1 :(得分:1)

UTF-16对平面0,基本多语言平面(BMP),U + 0000 ... U + FFFF中的字符使用两个字节,对任何其他字符使用四个字节。您不能用两个字节表示所有Unicode字符。

答案 2 :(得分:1)

  

为什么没有一种格式总是使用两个字节来编码每个字符?

有;它被称为UCS-2

问题是,直接的16位格式只能让你代表2 16 = 65 536个代码点。这对于Unicode 1.0来说已经足够了(其目标是“包含所有世界上生活语言的字符”),但随后项目的范围扩大到包括埃及象形文字等历史脚本,并且16位限制变得过于局限。

因此,Unicode Consortium决定添加16个补充平面,可容纳一百万个新字符,将代码空间的上限从U + FFFF扩展到U + 10FFFF。同时,发明了UTF-16的“代理对”机制,以便围绕UCS-2(特别是Windows NT和Java编程语言)构建的平台可以代表额外的代码点。