4.1)基础知识
4.1.1) GB2312
范围:0xA1A1--0xFEFE
汉字范围:0xB0A1--0xF7FE
编码方式:
GB2312规 定"对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示",习惯上称第一个字节为"高字节",第二个字节为"低字节"。
字符集:
GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
背景知识:
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。16-87区为汉字区(0xb0-0xf7)。故而GB2312最多能表示6763个汉字。
备注:
· GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。
· 在DBCS中,GB内码的存储格式始终是big endian,即高位在前。
· GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。
关键词: 中国国家标准,gb2312, 汉字:
4.1.2)GBK
范围:0×8140 - 0xFEFE
汉字范围:
GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。
编码方式:
GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。
字符集:
GBK 共收入21886个汉字和图形符号,包括:
GB2312 中的全部汉字、非汉字符号;
BIG5 中的全部汉字;
与 ISO-10646 相应的国家标准 GB13000 中的其它 CJK 汉字;
以上合计 20902 个汉字。
其它汉字、部首、符号,共计 984 个。
背景知识:
GBK 向下与 GB2312 完全兼容,向上支持 ISO-10646 国际标准,是一种过渡时期的编码实现方式。
GBK是GB2312-80的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是0x8140-0xfefe,剔除高位0x80的字位。其所有字符都可以一对一映射到Unicode2.0。
备注:
微软公司自Windows 95 简体中文版开始支持 GBK 代码,标准叫法是 Windows codepage 936,也叫做 GBK(国家标准),它也是 8-bit 的变长编码。据我所知 GBK从来没成为正式的国家标准,只不过因为Windows 的普及,它已经成为事实上的标准了。但目前的多数搜索引擎都不能很好地支持 GBK 汉字。
4.1.3) TW-BIG5:大五码
范围:0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE
编码方式:
每个字由两个字节组 成,其第一字节编码范围为0xA1~0xF9,第二字节编码范围为0×40~0×7E与0xA1~0xFE。
字符集:
总计收入13868个字 (包括5401个常用字、7652 个次常用字、7个扩充字、以及808个各式符号)。
背景知识:
Big5是台湾的IIIT1984年发明的,CNS 11643-1992( Chinese National Standard)是扩展版本,主要大家用的还是big5。BIG5又称大五码或五大码,1984年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大众 (FIC)创立,故称大五码。
4.1.4)unicode
国际标准组织于1984年4月成立ISO/IECJTC1/SC2/WG2工作组,针对各国文字、符号进行统一性编码。1991年美国跨国公司成立UnicodeConsortium,并于1991年10月与WG2达成协议,采用同一编码字集。目前Unicode是采用16位编码体系,其字符集内容与ISO10646的BMP(BasicMultilingualPlane)相同。
编码方法:Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,例如字母“A”的编码为 004116 。所以“A”的编码书写为“U+0041”。
Unicode编码表
|
|||||||
|
|
|
|||||
|
|
|
|
||||
|
|
|
|
||||
|
|
|
|
|
|||
|
|
|
|||||
|
|
|
|
|
|||
|
|
|
|
|
|||
|
E0000-E0FFF
|
|
|
|
4.1.5)utf-8
utf8是我们常用的编码方式,UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。
在web开发中使用utf8编码能完全解决字符集问题。其实utf8是unicode字符集的一种物理实现,它描述了如何高效的存储unicode的内码(就是上面说的字符在字符集的顺序码),RFC2044文档(http://www.ietf.org/rfc/rfc2044.txt?number=2044)描述了如何从一个内码转换成utf8格式的算法。英文不好没关系,看这个转换表就会马上明白了:
UCS-4 range (hex.) UTF-8 octet sequence (binary)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
上面的表格左边是16进制表示的unicode内码,最后一行的16进制数“7FFF FFFF”是utf8所能表示的内码的最大值,换成10进制是这样的一个数:2147483647(够大吧 )上面表格中右边一列就是utf8的二进制格式,转换规则可谓一目了然。
UTF-8 编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其它 Unicode 字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大大节省了编码长度(具体方案参见UTF-8)。
在旧式的中文、日文及韩文编码之中,每字符都使用2字节储存,而UTF-8须使用3字节。 (采用UTF-16编码则可只使用2字节储存。(编者言:事实上utf-8又是一种美国标准的做法,为了节约编码空间而不考虑国际通用性的一种造成事实的美国标准。)
4.1.6) unicode编码方式与实现方式
unicode是一种世界语言文字的编码标准。UCS 和 Unicode 只是分配整数给字符的编码表. Unicode 的编码方式与 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相对应,目前的用于实用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。上述16位 Unicode 字符构成基本多文种平面(Basic Multilingual Plane, 简称 BMP)。
最新(但未实际广泛使用)的 Unicode 版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。(UCS-4)
将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00。如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0x00。
Unicode 的实现方式不同于编码方式。一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。
UTF-8不使用大尾序和小尾序的形式。每个使用UTF-8储存的字符,除了第一个字节外,其余字节的头两个位都是以 "10" 开始,使文字处理器能够较快地找出每个字符的开始位置。
* 0xxxxxxx (00-7f)
* 110xxxxx 10xxxxxx (c0-df)(80-bf)
* 1110xxxx 10xxxxxx 10xxxxxx (e0-ef)(80-bf)(80-bf)
* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (f0-f7)(80-bf)(80-bf)(80-bf)
* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)
其它中文编码:
GB18030:
GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。
GB18030 编码是一二四字节变长编码。
一字节部分从 0×0~0×7F 与 ASCII编码兼容。
二字节部分: 首字节从 0×81~0xFE, 尾字节从 0×40~0×7E 以及0×80~0xFE, 与 GBK标准基本兼容。
四字节部分:
第一字节从 0×81~0xFE, 第二字节从 0×30~0×39, 第三和第四字节的范围和前两个字节分别相同。 四字节部分覆盖了从 0×0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。
Hong Kong GCCS
Hong Kong GCCS是香港政府为big5加的3049个字,(Government Chinese Character Set)香港增补字符集(HKSCS)是后来的标准,包括了Big5和ISO10646的编码,所以HKSCS的big5版是补充了GCCS的增强版。
编码字数统计:
GB2312 6763个汉字
GB12345 6866个汉字
GBK 21003个汉字
GB18030 27000个汉字
Big5 13053个汉字
CNS11643 48,027个汉字
汉字编码转化
GB2312
第一节字,行码0xA1-0xFE
第二节字,列码0x40-0x7E, 0xA1-0xFE,每行157个汉字
其中:1-3/38-40行(A1-A3, C6-C8) 全角字母、符号
4-39行(A4-C6) 一级汉字5401字
41-89行(C9-F9) 二级汉字7652字
例如:BIG5码16行121列同样表示“啊”字,编码为0xB0DA。
BIG5
第一节字,行码0xA1-0xFE
第二节字,列码0x40-0x7E, 0xA1-0xFE,每行157个汉字
其中:1-3/38-40行(A1-A3, C6-C8) 全角字母、符号
4-39行(A4-C6) 一级汉字5401字
41-89行(C9-F9) 二级汉字7652字
例如:BIG5码16行121列同样表示“啊”字,编码为0xB0DA。
第一字节
|
第二字节
|
字区
|
制定
|
A1..A2
|
40..7E, A1..FE
|
各种符号区
|
1984
|
A3
|
40..7E, A1..BF
|
各种符号区 (包括标点符号、ASCII 全角符号、注音符号等)
|
1984
|
A3
|
E1
|
欧元符号
|
CP950
|
A4..C5
|
40..7E, A1..FE
|
常用字区
|
1984
|
C6
|
40..7E
|
常用字区
|
1984
|
C6
|
A1..FE
|
罕用符号区
|
倚天
|
C7
|
40..7E, A1..FE
|
罕用符号区 (包括日文、俄文等)
|
倚天
|
C8
|
40..7E, A1..D3
|
罕用符号区 (包括俄文、输入法特殊符号等)
|
倚天
|
C9..F8
|
40..7E, A1..FE
|
次常用字区
|
1984
|
F9
|
40..7E, A1..D5
|
次常用字区
|
1984
|
F9
|
D6..DC
|
七个扩充字
|
倚天
|
F9
|
DD..FE
|
表格符号区
|
倚天
|
Table 1. BIG5字区与编码范围
扩充字
|
BIG5 码
|
Unicode 码
|
BIG5_1984 的同义字
|
碁
|
0xF9D6
|
0x88CF
|
棋
|
锈
|
0xF9D7
|
0x92B9
|
锈
|
里
|
0xF9D8
|
0x7CA7
|
里
|
墙
|
0xF9D9
|
0x58BB
|
墙
|
恒
|
0xF9DA
|
0x6052
|
恒
|
妆
|
0xF9DB
|
0x7881
|
妆
|
娴
|
0xF9DC
|
0x5AFA
|
娴
|
Table 2. 七个扩充字
编码
|
第一个字节
|
第二个字节
|
第三个字节
|
第四个字节
|
GB2312
|
0xB0 - 0xF7
|
0xA0 - 0xFE
|
|
|
GBK
|
0x81 - 0xFE
|
0x40 - 0xFE
|
|
|
GB18030 的双字节
|
0x81 - 0xFE
|
0x40 - 0x7E, 0x80 - 0xFE
|
|
|
GB18030 的四字节
|
0x81 - 0xFE
|
0x30 - 0x39
|
0x81 - 0xFE
|
0x30 - 0x39
|
Table 3. GB 的汉字编码规则