Unicode 字符编码

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

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

Unicode 根据要编码的数据类型使用两种编码格式:8 位和 16 位。 缺省编码格式是 16 位,即每个字符是 16 位(两个字节)宽,并且通常显示为 U+hhhh,其中 hhhh 是字符的十六进制代码点。 虽然生成的 65000 多个代码元素足以用于 编码世界上主要语言的大多数字符,但 Unicode 标准还提供了一种扩展机制,允许编码一百多万个字符。 扩展机制使用一对高位和低位代用字符来对扩展字符或补充字符进行编码。 第一个(或高位)代用字符具有 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 位)字符进行编码。 需要两个 UCS-2 字符(一个高位代用字符后面跟随一个低位代用字符)来对从 Unicode 版本 3.1 开始引入的每个新补充的字符进行编码。 这些补充字符在原始的 16 位“基本多语言位面”(BMP 或位面 0)外部定义。

UTF-16

ISO/IEC 10646 还定义了一种扩展技术,以使用两个 UCS-2 字符来对某些 UCS-4 字符进行编码。 此扩展技术称为 UTF-16,它相当于有代用字符的 Unicode 16 位编码格式。 总之,UTF-16 字符指令集由所有 UCS-2 字符和可通过代用字符访问的附加的一百万字符构成。

当将 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。