网站地图
UTF-32

UTF-32 (或 UCS-4)是一种将Unicode字符编码的协定,对每一个Unicode码位使用恰好32位元。其它的Unicode transformation formats则使用不定长度编码。因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的。特别地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。

虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。它更容易进行截断操作,但这方面并不比UTF-8及UTF-16强多少,因为后两者也只要在要截断的位置向前或向后至多搜索2-4个字符即可。

程序想直接定位到第n个字符且不去考察前n-1个字符的情形其实很少见。也就是说,虽然UTF-32遍历字符时候每一个字符都可以方便地下标+1,但是实际上在UTF-8和UTF-16中可以用一个记录已经遍历过的总字符宽度加上当前字符的宽度的整数来代替,二者效率其实差不多。其他一些情形,例如打算直接读取第n个字符而不打算去考察之前的字符,例如一些哈希操作和高速搜索算法,实际上并不需要n非常精确。以截断为例,用UTF-8或UTF-16也很简单,此时只需要调整指针的位置到最接近的字符边界处即可,这是一个固定时间的操作。

UTF-32也不会让计算所显示字符串的宽度更简单。因为即使用定宽字体,一个显示字符的位置也可能会存在多于一个编码字符(如结合字符)或一个编码字符对应多于一个显示字符的位置(如CJK表意符)。如果文本编辑器仅局限于从左到右且无结合字符,那么用UTF-32会有一定优势。但是这样的文本编辑器既然也不太可能支持非基本平面的字符,那么为什么不用UTF-16呢?

原本ISO 10646标准定义了一个32位元的编码形式,称作UCS-4,使用通用字符集(UCS)的每一个字符,会在0到十六进制的7FFFFFFF这样的字码空间中,被表示成一个的32位元的码值

UCS-4足以用来表示所有的Unicode的字码空间,其最大的码位为十六进制的10FFFF,所以其空间约有百万个码位。有些人认为保留如此大的字码空间却只为了对应这很小的码集是浪费的所以一个新的编码UTF-32被提出来了。UTF-32 是一个 UCS-4 的子集,使用32-位元的码值,只在0到10FFFF的字码空间。

UTF-32 原本是 UCS-4 的子集,但JTC1/SC2/WG2声明,所有未来对字符的指定都将会限制在BMP及其14个补充平面,并移除先前在 E0 到 FF 平面的 60 到 7F 群的私用空间。

于是就现状而言,除了 UTF-32 标准包含额外的 Unicode 意涵,UCS-4 和 UTF-32 大体是相同的。

(英文)The Unicode Standard 4.1,第三章 - 在§3.10, D43-D4中正式定义 UTF-32(英文)Unicode Standard Annex #19 - Unicode 3.x 中正式定义的 UTF-32(2001 年三月;最后更新于 2002 年三月)(英文)注册新字集:UTF-32, UTF-32BE, UTF-32LE - IANA 字符集新增 UTF-32的宣言(2002 年四月)


相关文章推荐:
字符编码 | 字符 | 字节 | 广泛 | UTF-8 | UTF-16 | ISO 10646 | 通用字符集 | 十六进制 | 字符 | 字符集 |
相关词汇词典