字符、字符集、字符编码
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
我们知道计算机内部是用二进制表示数据的,计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。
需要特别注意的是:字符集和字符编码不是一一对应的关系,一个字符集可以有多个对应的字符编码方案,字符集表示收录了多收字符,字符编码表示如何给收录的字符编码(哪个字放在哪个位置)。
常用字符编码
标准 | 名称 | 分类 | 长度 | 编码范围 | 说明 |
ASCII | 标准ASCII | 1字节 | 0x00-0x7F | 128字符(33个无法显示),7有效位 | |
ISO 8859系列 | (EASCII) | 扩展ASCII | 1字节 | 8有效位 | |
GB2312 | GB系列 | 2个字节 | 0xA1A1-0x7E7E | 低字节兼容ASCII。包括6763个汉字 | |
GBK | 汉字内码扩展规范 | GB系列 | 2个字节 | 0x8140-0xFEFE | 是GB2312的扩展,加入对繁体字的支持,兼容GB2312。非国家标准 |
BIG5 | 大五码 | 2个字节 | 国标繁体汉字13053 | ||
Unicode | 万国码、国际码、统一码、单一码 | 4个字节 | 首256字符保留给ISO 8859-1所定义的字符 | ||
UTF-8 | 变长 | 1-6字节表示(其中汉字3-4个字节表示) |
ASCII编码
American Standard Code for InformationInterchange,美国信息交换标准代码
控制字符
可显示字符
EASCII
Extended ASCII,延伸美国标准信息交换码,是将ASCII码由7位扩充为8位而成。EASCII的内码是由0到255共有256个字符组成。EASCII码比ASCII码扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。
ISO8859-1就是EASCII最典型的实现。
GB2312
GB 2312 或 GB 2312-80 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
涵盖了几乎全部简化汉字,不能处理繁体字、古汉字、罕用字。
分区表示
GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
字节结构
在使用GB2312的程序通常采用EUC储存方法,以便兼容于ASCII。(就是采用8位字符编码,参见:http://zh.wikipedia.org/wiki/EUC)。每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
我的分析:高位字节表示区,低位字节表示所在区的位置。为了做到GB2312字符和ASCII字符混排(就是一段文字中既存在GB2312又存在ASCII字符)时,能够快速识别二者(因为一个是双字节编码另一个是单字节编码)所以人为的在高位和低位字节上加了补码0xA0(即160),这样做是因为ASCII码的范围0~127,在读到一个字节的高位超过ASCII码的范围是按照双字节处理GB2312字符集的方式处理,否则按照ASCII码处理。
图示
区位 | 高字节范围 | 低字节范围 | 说明 |
01-09 | 0xA1-0xA9(区位码+0xA0) | 0xA1-0xFE(把01-94加上0xA0) | 特殊符号 |
10-15 | 空 | ||
16-55 | 0xB0-0xD7(区位码+0xA0) | 0xA1-0xF9(把01-94加上0xA0) | 一级汉字按拼音排序(0xD70xFA到0xD70xFE空余5个位置) |
56-87 | 0xD8-0xF7(区位码+0xA0) | 0xA1-0xFE(把01-94加上0xA0) | 二级汉字按照部首、笔画排序 |
88-94 | 空 |
GBK
兼容GB2312的过渡标准
图示
GB 18030
全称:国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》的修订版。与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个3002。
采用多字节编码,每个字可以由1个、2个或4个字节组成。
Unicode
编码方式
目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。
实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)
UTF-8
UTF-8(8-bit UnicodeTransformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
UTF-16
UTF-16是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为"storageformat")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
UTF-16与UCS-2(UTF-8)的关系
UTF-16可看成是UCS-2的父集。在没有辅助平面字符(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2bytes的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。
UTF-32
UTF-32 (或 UCS-4)是一种将Unicode字符编码的协议,对每一个Unicode码位使用恰好32比特。其它的Unicodetransformation formats则使用不定长度编码。
UTF-16的大头和小头
UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以Microsoft或Linux制作或存储的文字使用小尾序格式。
为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以显示这个文本文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。
在UTF-16中,字节顺序标记被放置为文件或字符串流的第一个字符,以标示在此文件或字符串流中,以所有十六比特为单位的字码的尾序(字节顺序)。
如果十六比特单位被表示成大尾序,这字节顺序标记字符在串行中将呈现0xFE,其后跟着0xFF(其中的0x用来标示十六进制)。
如果十六比特单位使用小尾序,这个字节串行为0xFF,其后接着0xFE。
如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。
图示
文件编码、文件声明编码
文件编码是只文本文件本身的编码;
文件声明编码是指例如网页文件中按照特定语法声明的编码;
在网页文件中上述两个编码应该一致;
ANSI
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
特别说明:经过验证在简体中文系统下(简体win7),ANSI编码应该代表GBK编码。
图示
上图中的文档编码格式显示是ANSI,可以看到文档中的中文是正常显示的,间接证明了此处ANSI是GB2312(至少是兼容GB2312)。
Windows系统下的ANSI设置
最后一张图的设置决定了系统默认的编码。
全角和半角
全角(大陆、日本、韩国称全角;台湾、香港称全形;也称全宽或全码)和半角(大陆、日本、韩国称半角;台湾、香港称半形;也称半宽或半码),是计算机中,中、日、韩文的CJKV字符的显示格式。
特别说明:汉字全部是全角字符而拉丁字母、数字、符号等既有全角字符也有半角字符;
拉丁字母、数字、符号(键盘上的)使用全角和半角输入时,二进制编码不同。
总结
GB2312可以认为等同于GBK;
把unicode看成字符集,UTF-8、UTF-16、UTF-32看作字符编码;
说unicode一定要搞清楚是那种编码;
UTF-8便于传输,容错性强,
GB2312、GBK、UTF-8、UTF-16都是变长编码,前两者单字节表示ASCII字符;
参考文档
维基百科