第 7 章 Unicode
7.1 关于编码
通常,英文编码较为统一,都采用ASCII编码或可以兼容ASCII编码(即编码表的前127位与ASCII编码一直,常见的各种编码,包括Unicode编码都是如此)。也就是说,稳赢字母、阿拉伯数字、稳赢的各种符号,在不同编码下的码值(Code Point)基本是一样的,比如字母A
,起码值总是41;中文的情况则不同,常见的中文编码有GB18030(也就是CP54936,主要是在Windows平台下使用。早期是GBK,也就是CP936,如今采用的GB18030与GBK是兼容的,考虑到大家习惯说“GBK编码”,下文也采用“GBK编码”的说法)和Unicode(主要用于Linux/UNIX、Mac OS)两种,同一个中文字符在两种编码下的码值并不相同。比如“发”,在GBK编码下的码值为b7a2,而在Unicode下其码值为53d1(根据惯例,Unicode字符一般即为\uhex的形式,其中hex是码值的十六进制表示,所以“发”的Unicode记法就是\u53d1).
为方便下面的讲解,这里先约定两种提法:
ASCII字符,即ASCII编码表中的字符(也就是码值在0 ~ 127之间的字符,不包括扩展ASCII字符),每个字符用一个字节表示。常见的英文字符和半角标点符号,都属于ASCII字符。
非ASCII字符,即ASCII编码表之外的字符,在本书中指多字节字符。中文字符属于“非ASCII字符”,它们在GBK编码中一般占用2个字节,在UTF-8编码中占用3个字节。常见的Unicode编码是UTF-8,它是Unicode的一种存储格式,UTF-16也是一种存储格式。无论是UTF-8还是UTF-16,同一字符的Unicode编码是不变的,只是存储时的变现形式不同。比如“发”的码值53的,但以UTF-8编码保存时占用3个字符,分别是e5 8f 91,保存为UTF-16编码时占用用2个字符,分别53 d1。