UTF-32是32位Unicode转换格式(Unicode Transformation Formats, 或UTF)的缩写。UTF-32是一种用于编码Unicode的协定,该协定使用32位比特对每个Unicode码位进行编码(但前导比特数必须为零,故仅能表示231个Unicode码位)。与其他可变长度的Unicode转换格式(UTF)相比,UTF-32编码长度是固定的,UTF-32中的每个32位值代表一个Unicode码位,并且与该码位的数值完全一致。

UTF-32的主要优点是可以直接由Unicode码位来索引。在编码序列中查找第N个编码是一个常数时间操作。相比之下,其他可变长度编码需要进行循序访问操作才能在编码序列中找到第N个编码。这使得在计算机程序设计中,编码序列中的字符位置可以用一个整数来表示,整数加一即可得到下一个字符的位置,就和ASCII字符串一样简单。

UTF-32的主要缺点是每个码位使用四个字节,空间浪费较多。在大多数文本中,非基本多文种平面的字符非常罕见,这使得UTF-32所需空间接近UTF-16的两倍和UTF-8的四倍(具体取决于文本中ASCII字符的比例)。

尽管每一个码位使用固定长度的字节看似方便,但UTF-32并不如其它Unicode编码使用广泛。与UTF-8UTF-16相比,UTF-32更容易遭到截断。即使使用了"定宽"字体,在大多数情况下用UTF-32计算显示字符串的宽度也并不比其他编码更加容易。主要原因是,存在着一个字符位置会有多于一种可能的码点(结合字符)或一个码点用多于一个字符位置(如CJK表意字符)。结合符号也意味着,文书编辑者不能将一个码位视同一个编辑上的单位。

历史

原本ISO 10646标准定义了一个32位的编码形式,称作UCS-4通用字符集(UCS)的每一个字符由0到十六进制的7FFFFFFF的31位数值表示(符号位未使用且零)。UCS-4足以用来表示所有的Unicode的字码空间,其最大的码位为十六进制的7FFFFFFF,所以其空间约20亿个码位。2003年11月,由于UTF-16编码形式的限制,RFC 3629标准将Unicode限制为仅支持U+10FFFF以内的码位(另外U+D800到U+DFFF范围内也被保留使用)[1][2]。虽然在之前的ISO标准(1998年的Unicode 2.1)中0xE00000到0xFFFFFF和0x60000000到0x7FFFFFFF这些区域被分配给“保留私人使用”,但这些区域也在后续版本中被删除。在 ISO/IEC JTC 1/SC 2 WG2申明中规定UCS-4将来所有的字符分配将被限制在Unicode范围内,所以UTF-32和UCS4能表示的字符是相同的。

注释

  1. ^ ISO/IEC 10646:2014页面存档备份,存于互联网档案馆) Clause 9.4: "Because surrogate code points are not UCS scalar values, UTF-32 code units in the range 0000 D800-0000 DFFF are ill-formed". Clause 4.57: "[UCS codespace] consisting of the integers from 0 to 10 FFFF (hexadecimal)". Clause 4.58: "[UCS scalar value] 存档副本 (PDF). [2017-04-13]. (原始内容 (PDF)存档于2015-01-04).  any UCS code point except high-surrogate and low-surrogate code points".
  2. ^ Mapping code points to Unicode encoding forms页面存档备份,存于互联网档案馆), § 1: UTF-32

外部链接