Unicode 字符编码

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

有关Unicode的信息,请参阅 《Unicode标准》 以及Unicode Consortium网站 www.unicode.org )。

Unicode使用两种编码形式:8位和16位,取决于被编码的数据类型。 默认编码格式为16位,每个字符占16位(2字节)。 十六进制编码通常以U+hhhh的形式显示,其中hhhh是字符的十六进制代码点。 这种编码形式可生成超过65000个编码元素,足以对世界上主要语言的大多数字符进行编码。 Unicode标准还提供了一种扩展机制,允许编码多达100万个额外的字符。 扩展机制使用一对高位和低位代用字符来对扩展字符或补充字符进行编码。 第一个(或高位)替代字符的代码值介于 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 可以编码 3.0定义的所有(16位)字符。 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个字节长。

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

表 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。