汉字编码基础知识(⼀)
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;汉字从0x b0a1开始,结束于0x f7fe。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个各式符号)。ascii是几位二进制编码
背景知识:
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⽂档()描述了如何从⼀个内码转换成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)
上⾯的表格左边是16进制表⽰的unicode内码,最后⼀⾏的16进制数“7FFF FFFF”是utf8所能表⽰的内码的最⼤值,换成10进制是这样的⼀个
数:2147483647(够⼤吧:))上⾯表格中右边⼀列就是utf8的⼆进制格式,转换规则可谓⼀⽬了然。
编码,这是⼀种变长编码,它将基本7位ASCII字符仍⽤7位编码表⽰,占⽤⼀个字节(⾸位补0)。⽽遇到与其它 Unicode 字符混合的情况,将按⼀定算法转换,每个字符使⽤1-3个字节编码,并利⽤⾸位为0或1进⾏识别。这样对以7位ASCII字符为主的西⽂⽂档就⼤⼤节省了编码长度(具体⽅案参见)。
UTF-8 使⽤可变长度字节储存,使计算机程序设计变得复杂。 (故此,在计算机程序或操作系统内部,多采⽤编码。)
在旧式的中⽂、⽇⽂及韩⽂编码之中,每字符都使⽤2字节储存,⽽UTF-8须使⽤3字节。 (采⽤编码则可只使⽤2字节储存。(编者⾔:事实上utf-8⼜是⼀种美国标准的做法,为了节约编码空间⽽不考虑国际通⽤性的⼀种造成事实的美国标准。)
4.1.6) unicode编码⽅式与实现⽅式
unicode是⼀种世界语⾔⽂字的编码标准。UCS 和 Unicode 只是分配整数给字符的编码表. Unicode 的编码⽅式与 的,使⽤16
最新(但未实际⼴泛使⽤)的 Unicode 版本定义了16个
将⼀个 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..A240..7E,
A1..FE
各种符号区1984
A340..7E,
A1..BF 各种符号区 (包括标点符号、ASCII 全⾓符号、注⾳
符号等)
1984
A3E1欧元符号CP950
A4..C540..7E,
A1..FE
常⽤字区1984 C640..7E常⽤字区1984 C6A1..FE罕⽤符号区倚天
C740..7E,
A1..FE
罕⽤符号区 (包括⽇⽂、俄⽂等)倚天
C840..7E,
A1..D3
罕⽤符号区 (包括俄⽂、输⼊法特殊符号等)倚天
C9..F840..7E,
A1..FE
次常⽤字区1984
F940..7E,
A1..D5
次常⽤字区1984 F9D6..DC七个扩充字倚天
第⼀字节第⼆字节字区制定
F9DD..FE表格符号区倚天
Table 1. BIG5字区与编码范围
扩充字BIG5 码Unicode 码BIG5_1984 的同义字
碁0xF9D60x88CF棋
锈0xF9D70x92B9锈
⾥0xF9D80x7CA7⾥
墙0xF9D90x58BB墙
恒0xF9DA0x6052恒
妆0xF9DB0x7881妆
娴0xF9DC0x5AFA娴
Table 2. 七个扩充字
编码第⼀个字节第⼆个字节第三个字节第四个字节GB23120xB0 - 0xF70xA0 - 0xFE
GBK0x81 - 0xFE0x40 - 0xFE
GB18030 的双字节0x81 - 0xFE0x40 - 0x7E, 0x80 - 0xFE
GB18030 的四字节0x81 - 0xFE0x30 - 0x390x81 - 0xFE0x30 - 0x39
Table 3. GB 的汉字编码规则
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论