UTF-32

来自GSXAB的知识库
UTF-32
术语名称 UTF-32
英语名称 UTF-32
别名 UCS-4

UTF-32 是一个将 Unicode 字符集编码为四字节流的字符编码方法。 UTF 即 Unicode Transformation Format , Unicode 传输格式。

这一编码是定长编码,无论哪一个 Unicode 码位都会被编码为一个四字节。尽管现代 Unicode 范围仅需要 21 位,但是按惯例被编码为 32 位,其中高 11 位永远为 0 。

由于历史原因, UTF-32 有时也会被称为 UCS-4 ,此时也可以认为其范围为 0 到 7FFFFFFFH

编码规则

UTF-32 中,全部的二进制表示都是以四字节为单位的。每个四字节所对应的二进制数值就是对应码位上的字符。

超过 U+10FFFF 的范围,以及代理对区块 U+D800-DFFF 的范围均无效。

特征

UTF-32 是定长编码,不涉及解析时同步位置错误的问题,需要指定其中第几个字符、计算字符串中字符数量时可以不需要遍历判断字符情况。

由于大量范围都是无效码位,而且正常环境中出现的字符基本处在 BMP 内, UTF-32 编码的文件实际上非常稀疏,几乎所有的四字节中都有一对字节是全 0 的。

错误处理

由于四字节和码位是一一对应关系,只要不出现无效码位,没有其他与机制相关的错误。默认情况下,如果出现非正常码位,以及半个代理对单独出现的情况,大多数编解码实现中还是会使用与其对应的字符而不做特殊处理。

BOM

UTF-32 是以四字节为单位读写的,由于大多数储存传输协议中基本单位都是字节,因此存在字节序问题。尽管传输中极少使用这么额外浪费空间的编码方式,其也存在字节序标记规则,与 UTF-16 相同。

如果允许指定字节序,大端(big-endian, BE)和小端(small-endian, LE)的编码分别被称为 UTF-32BE 和 UTF-32LE 。在编码类型中指定字节序时,不要求带有字节序标记。

若字节序无法指定,默认需要一个字节序标记 U+FEFF Byte Order Mark 在流头部来确定字节序。在 Unicode 中, U+FEFF 是保留给字节序的功能字符,而 U+FFFE0000 根本不在范围内,因此只要查看前四个字节构成其中的哪一个就能确认当前文档中的字节序。

若字节序未指定的同时,又缺少字节序标记 BOM ,也就是前四个字节既不是 0x00.00.FE.FF 也不是 0xFF.FE.00.00 ,此时 RFC 2781 推荐将大端作为默认编码。但是由于 Windows 等环境默认小端,不少实现中也会将小端作为默认的字节序。


常见字符编码
早期编码 电报码、 BCD 码BCDICEBCDIC)、ASCIIISO 646
ISO 8859 ISO 8859-1 、 ISO 8859-2 、……
国标系列 IBM 代码页 936 / GB 2312微软代码页 936 / GBK微软代码页 54936 / GB 18030
Unicode / ISO 10646 UTF-7 、 UTF-8UTF-16UTF-32

参考资料

https://en.wikipedia.org/wiki/UTF-32