浅解字符编码相关问题

字符、字符集、字符编码

字符(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字符;

 

参考文档

GB2312 编码的补码为何是0xA0?

维基百科

本文全部内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值