Unicode 字符编码

Unicode 字符编码标准是固定长度字符编码方案,它包含了世界上几乎所有现用语言的字符。

有关 Unicode 的信息可在 The Unicode Standard以及 Unicode Consortium Web 站点 ( www.unicode.org) 中找到。

Unicode 使用两种编码格式: 8-bit 和 16-bit ,基于正在编码的数据的数据类型。 缺省编码格式为 16 位,其中每个字符宽为 16 位 (2 字节)。 16 位编码格式通常显示为 U + hhhh ,其中 hhhh 是字符的十六进制代码点。 这种编码形式产生了超过 65000 个代码元素,这足以编码世界主要语言的大部分字符。 Unicode 标准还提供了一种扩展机制,允许对多达 1,000,000 个额外字符进行编码。 扩展机制使用一对高位和低位代用字符来对扩展字符或补充字符进行编码。 第一个 (或高) 代理字符的代码值介于 U+D800 和 U + DBFF 之间。 第二个 (或低) 替代字符具有介于 U+DC00 和 U + DFFF 之间的代码值。

UCS-2

国际标准化组织 (ISO) 和国际电工委员会 (IEC) 标准 10646 (ISO/IEC 10646) 指定通用多八位元编码字符集 (UCS)。 此字符集具有 16 位 (双字节) 版本 (UCS-2) 和 32 位 (四字节) 版本 (UCS-4)。 UCS-2 相当于没有代用字符的 Unicode 16 位格式。 UCS-2 可以对 Unicode 版本 3.0 指令表中定义的所有 (16 位) 字符进行编码。 从 Unicode 版本 3.1开始,需要两个 UCS-2 字符 (后跟一个低替代字符) 来对每个新的补充字符进行编码。 这些补充字符在原始的 16 位“基本多语言位面”(BMP 或位面 0)外部定义。

UTF-16

ISO/IEC 10646 还定义了一种扩展技术,用于使用两个 UCS-2 字符对某些 UCS-4 字符进行编码。 此扩展技术称为 UTF-16,它相当于有代用字符的 Unicode 16 位编码格式。 总之, UTF-16 字符指令表由所有 UCS-2 字符以及可通过代理对访问的额外 1,000,000 个字符组成。

将 16 位 Unicode 字符序列化为字节时,字节的显示顺序取决于正在使用的处理器。 一些处理器将最重要的字节放在初始位置 (称为大尾数法顺序) ,而另一些处理器将最不重要的字节放在第一位 (称为小尾数法顺序)。 Unicode 的缺省字节排序是大尾数法。

UTF-8

对于面向字节基于 ASCII 的应用程序和文件系统,16 位 Unicode 字符是引起问题的主要因素。 例如,非 Unicode 感知应用程序可能会将大写字符 "A" (U+0041) 的前导 8 零位误解为单字节 ASCII NULL 字符。

UTF-8(UCS 变换格式 8)是一种算法变换,它将定长 Unicode 字符变换为变长 ASCII 安全的字节字符串。 在 UTF-8 中,ASCII 和控制字符 由通常的单字节代码表示,但其他字符变为双字节或更多字节。 UTF-8 可以对非补充字符和补充字符进行编码。

UTF-8 字符的最大长度可以为 4 个字节。 非补充字符的最大长度为 3 字节,补充字符的最大长度为 4 字节。

可以从 表 1中确定采用 UTF-8 格式的每个 UTF-16 字符的字节数。

表 1. UTF-8 的位分布
代码值

(二进制)

UTF-16

(二进制)

首字节

(二进制)

第二个字节

(二进制)

第三个字节

(二进制)

第四字节

(二进制)

00000000

0xxxxxxx

00000000

0xxxxxxx

0xxxxxxx      
00000yyy

yyxxxxxx

00000yyy

yyxxxxxx

110yyyyy 10xxxxxx    
zzzzyyyy

yyxxxxxx

zzzzyyyy

yyxxxxxx

1110zzzz 10yyyyyy 10xxxxxx  
uuuuu

zzzzyyyy

yyxxxxxx

110110ww

wwzzzzyy

110111yy

yyxxxxxx

11110uuu

(其中 uuuuu = wwww+1)

10uuzzzz 10yyyyyy 10xxxxxx

在上表中列示的每个代码值中,u、w、x 、y 和 z 串都是字符的位表示。 例如,U+0080 变换为二进制格式中的 11000010 10000000,而代用字符对 U+D800 U+DC00 变为 二进制格式中的 11110000 10010000 10000000 10000000。