游戏开发工具

GB2312编码和GBK编码,将中文存储到计算机

编码标准-GB2312 GBK GB18030

基本概念

区位码

GB 2312

GBK

GB 18030

基本概念

国家标准代码,简称国标码,亦被新加坡采用。国家标准强制标准冠以“GB”。推荐标准冠以“GB/T”


GB

现时中华人民共和国官方强制使用 GB 18030 标准,但较旧的计算机仍然使用 GB 2312

GB”在计算机领域中常常表示 GB 2312-80 或 GB 18030-2005。两者是汉语编码系统的标准,在中国大陆和新加坡用于简体中文。


常用编码集

国家汉字标准代码,较常见的国家汉字标准代码列表

GB 2312 - 80 信息交换用汉字编码字符集 基本集(又称为GB0)

GB 13000 - 93 信息技术 通用多八位编码字符集(UCS)第一部分

GB 18030 - 2000 信息技术 信息交换用汉字编码字符集 基本集的扩充


其他中华人民共和国发布有关汉字标准代码列表:

GB/T 12345 - 90 信息交换用汉字编码字符集 第一辅助集(又称为GB1)

GB/T 7589 - 87 信息交换用汉字编码字符集 第二辅助集(又称为GB2)

GB 13131 - 91 信息交换用汉字编码字符集 第三辅助集(又称为GB3)

GB/T 7590 - 87 信息交换用汉字编码字符集 第四辅助集(又称为GB4)

GB 13132 - 91 信息交换用汉字编码字符集 第五辅助集(又称为GB5)

GB/T 16500 - 1998 信息交换用汉字编码字符集 第七辅助集


国家推荐标准以 “/T” 来表示并非强制执行。


由于GB 2312-80只收录了6763个汉字,未能覆盖繁体中文字、部分人名、方言、古汉语等方面出现的罕用字,所以发布了以上的辅助集。


其中,GB/T 12345-90辅助集是GB 2312-80基本集的繁体字版本;GB 13131-91GB/T 7589-87的繁体字版本;GB 13132-91是GB/T 7590-87的繁体字版本。而GB/T 16500-1998是繁体字版本,它并无对应的简体字版本。


鉴于第二辅助集及第四辅助集,有不少汉字均是“类推简化汉字”,实用性不高,因而较少人采用。


中华人民共和国国家标准总局于2000年推出强制性的GB 18030-2000标准。于2001年8月31日后发布或出厂的产品,必须符合GB 18030-2000的相关要求。


区位码

国标码是一个四位十六进制数,区位码是一个四位的十进制数,每个国标码或区位码都对应着一个唯一的汉字或符号,但因为十六进制数我们很少用到,所以大家常用的是区位码,它的前两位叫做区码,后两位叫做位码


编码规则

01-09 区为特殊符号

10-15 区为用户自定义符号区(未编码)

16-55 区为一级汉字,按拼音排序

56-87 区为二级汉字,按部首/笔画排序

88-94 区为用户自定义汉字区(未编码)


在区位码中,01-09区为特殊字符,16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列),56-87区为二级汉字(3008个汉字,按部首次序排列), 在区位码汉字输入方法中,汉字编码无重码,在熟练掌握汉字的区位码后,录入汉字的速度是很快的,但若想记忆住全部区位码是相当困难的,常使用于录入特殊符号,如制表符、希腊字母等。


部分编码

想要了解全部的区位码,可以去 这里 了解 ,也可以自己百度。


这是01区的 编码 特殊符号

01 0 1 2 3 4 5 6 7 8 9

0     、 。 · ˉ ˇ ¨ 〃 々

1 — ~ ‖ … ‘ ’ “ ” 〔 〕

2 〈 〉 《 》 「 」 『 』 〖 〗

3 【 】 ± × ÷ ∶ ∧ ∨ ∑ ∏

4 ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠ ⌒ ⊙

5 ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯

6 ≤ ≥ ∞ ∵ ∴ ♂ ♀ ° ′ ″

7 ℃ $ ¤ ¢ £ ‰ § № ☆ ★

8 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※

9 → ← ↑ ↓ 〓


这是10区的 编码 用户自定义符号区(未编码)

10 0 1 2 3 4 5 6 7 8 9

0           

1          

2          

3          

4          

5          

6          

7          

8          

9     


这是16区的编码 一级汉字 ,按拼音字母的次序排列

16 0 1 2 3 4 5 6 7 8 9

0   啊 阿 埃 挨 哎 唉 哀 皑 癌

1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺

2 按 暗 岸 胺 案 肮 昂 盎 凹 敖

3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒

4 叭 吧 笆 八 疤 巴 拔 跋 靶 把

5 耙 坝 霸 罢 爸 白 柏 百 摆 佰

6 败 拜 稗 斑 班 搬 扳 般 颁 板

7 版 扮 拌 伴 瓣 半 办 绊 邦 帮

8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤

9 苞 胞 包 褒 剥


这是56区的编码 二级汉字 ,按部首次序排列

56 0 1 2 3 4 5 6 7 8 9

0   亍 丌 兀 丐 廿 卅 丕 亘 丞

1 鬲 孬 噩 丨 禺 丿 匕 乇 夭 爻

2 卮 氐 囟 胤 馗 毓 睾 鼗 丶 亟

3 鼐 乜 乩 亓 芈 孛 啬 嘏 仄 厍

4 厝 厣 厥 厮 靥 赝 匚 叵 匦 匮

5 匾 赜 卦 卣 刂 刈 刎 刭 刳 刿

6 剀 剌 剞 剡 剜 蒯 剽 劂 劁 劐

7 劓 冂 罔 亻 仃 仉 仂 仨 仡 仫

8 仞 伛 仳 伢 佤 仵 伥 伧 伉 伫

9 佞 佧 攸 佚 佝


16区所有字符的对应的区位码如下:

啊(1601) 阿(1602) 埃(1603) 挨(1604) 哎(1605) 唉(1606) 哀(1607) 皑(1608) 癌(1609) 蔼(1610)

矮(1611) 艾(1612) 碍(1613) 爱(1614) 隘(1615) 鞍(1616) 氨(1617) 安(1618) 俺(1619) 按(1620)

暗(1621) 岸(1622) 胺(1623) 案(1624) 肮(1625) 昂(1626) 盎(1627) 凹(1628) 敖(1629) 熬(1630)

翱(1631) 袄(1632) 傲(1633) 奥(1634) 懊(1635) 澳(1636) 芭(1637) 捌(1638) 扒(1639) 叭(1640)

吧(1641) 笆(1642) 八(1643) 疤(1644) 巴(1645) 拔(1646) 跋(1647) 靶(1648) 把(1649) 耙(1650)

坝(1651) 霸(1652) 罢(1653) 爸(1654) 白(1655) 柏(1656) 百(1657) 摆(1658) 佰(1659) 败(1660)

拜(1661) 稗(1662) 斑(1663) 班(1664) 搬(1665) 扳(1666) 般(1667) 颁(1668) 板(1669) 版(1670)

扮(1671) 拌(1672) 伴(1673) 瓣(1674) 半(1675) 办(1676) 绊(1677) 邦(1678) 帮(1679) 梆(1680)

榜(1681) 膀(1682) 绑(1683) 棒(1684) 磅(1685) 蚌(1686) 镑(1687) 傍(1688) 谤(1689) 苞(1690)

胞(1691) 包(1692) 褒(1693) 剥(1694)


GB 2312

《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980。


GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。


基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。


把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持 ISO/IEC10646—1 和 GB 13000—1 的全部中、日、韩(CJK)汉字,共计20902字。


收录

GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。

对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。


分区表示

GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。

01-09区为特殊符号。

16-55区为一级汉字,按拼音排序。

56-87区为二级汉字,按部首/笔画排序。

10-15区及88-94区则未有编码。

举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。


字节结构

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上“GB2312”,通常都是指“EUC-CN”表示法。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节”),第二个字节称为“低位字节”(也称“位字节”)。


“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。


72 = 87 - 16 + 1; 高字节位为01-87区

1

例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。


GB 2312 简体中文编码表部分

想了解完整的编码表,可以去 这里 ,或者自己百度。


code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F

B0A0 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘

B0B0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱

B0C0 袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋

B0D0 靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑

B0E0 班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮

B0F0 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥


这是区位码部分复制过来的16区 一级汉字 编码

16 0 1 2 3 4 5 6 7 8 9

0   啊 阿 埃 挨 哎 唉 哀 皑 癌

1 蔼 矮 艾 碍 爱 隘 鞍 氨 安 俺

2 按 暗 岸 胺 案 肮 昂 盎 凹 敖

3 熬 翱 袄 傲 奥 懊 澳 芭 捌 扒

4 叭 吧 笆 八 疤 巴 拔 跋 靶 把

5 耙 坝 霸 罢 爸 白 柏 百 摆 佰

6 败 拜 稗 斑 班 搬 扳 般 颁 板

7 版 扮 拌 伴 瓣 半 办 绊 邦 帮

8 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤

9 苞 胞 包 褒 剥


根据字体结构部分的内容,我们可以完成区位码到国标码的转换,如果不明白的,我们多举几个例子,如下:

啊 的区位码为1601,国标码为B0A1,二进制为1011000010100001, 0xB0=0xA0+16 , 0xA1=0xA0+1

剥 的区位码为1694,国标码为B0FE,二进制为1011000011111110, 0xB0=0xA0+16 , 0xFE=0xA0+94

0xB0=0xA0+16   B0 转化为十进制是 176, A0转化为十进制是 160 , 160 + 16 = 176
0xA1=0xA0+1    A1 转化为十进制是 161, A0转化为十进制是 160 , 160 + 1 = 161
0xFE=0xA0+94   A0 转化为十进制是 160, FE转化为十进制是 254, 160 + 94 = 254

这里涉及到16进制的计算问题,大家可以找一些网站自己计算一下,可以去 这里 ,或者自己百度。


到此,上面 字节结构 部分讲到的 高位字节、低位字节 之间 区位码和国标码之间的转换 后的范围,占用的码位,我们就理解的比较形象了。


而5个空位是D7FA-D7FE是对应的区位码也是空位,如下:

55 0 1 2 3 4 5 6 7 8 9

0   住 注 祝 驻 抓 爪 拽 专 砖

1 转 撰 赚 篆 桩 庄 装 妆 撞 壮

2 状 椎 锥 追 赘 坠 缀 谆 准 捉

3 拙 卓 桌 琢 茁 酌 啄 着 灼 浊

4 兹 咨 资 姿 滋 淄 孜 紫 仔 籽

5 滓 子 自 渍 字 鬃 棕 踪 宗 综

6 总 纵 邹 走 奏 揍 租 足 卒 族

7 祖 诅 阻 组 钻 纂 嘴 醉 最 罪

8 尊 遵 昨 左 佐 柞 做 作 坐 座

9     


code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F

D7A0 住 注 祝 驻 抓 爪 拽 专 砖 转 撰 赚 篆 桩 庄

D7B0 装 妆 撞 壮 状 椎 锥 追 赘 坠 缀 谆 准 捉 拙 卓

D7C0 桌 琢 茁 酌 啄 着 灼 浊 兹 咨 资 姿 滋 淄 孜 紫

D7D0 仔 籽 滓 子 自 渍 字 鬃 棕 踪 宗 综 总 纵 邹 走

D7E0 奏 揍 租 足 卒 族 祖 诅 阻 组 钻 纂 嘴 醉 最 罪

D7F0 尊 遵 昨 左 佐 柞 做 作 坐 座     


两种不同的GB2312实现

有两种不同的GB2312实现,在它们之间存在少量的差别,其中至少有一个是错误的。

1.jpg

实现A与GBK/GB18030兼容,实现B则不兼容。

在2015年, 微软.Net Framework在使用实现A。 iconv-1.14, php-5.6, ActivePerl-5.20, Java 1.7, Python 3.4在使用实现B,也就是说上面这几种版本的编程语言不兼容GBK/GB18030。


GBK

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。这一版的GBK规范为1.0版。


基本含义

GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。ISO 10646 是国际标准化组织 ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于 ISO 10646.1)。


GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。


编码方式

经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。


收录字汇

GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充,CJK表示中国日本韩国。具体包括:

1.GB 2312 中的全部汉字、非汉字符号。

2.GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字。

3.《简化字总表》中未收入 GB 13000.1 的 52 个汉字。

4.《康熙字典》及《辞海》中未收入 GB 13000.1 的 28 个部首及重要构件。

5.13 个汉字结构符。

6.BIG-5 中未被 GB 2312 收入、但存在于 GB 13000.1 中的 139 个图形符号。

7.GB 12345 增补的 6 个拼音符号。

8.汉字“○”。

9.GB 12345 增补的 19 个竖排标点符号(GB 12345 较 GB 2312 增补竖排标点符号 29 个,其中 10 个未被 GB 13000.1 收入,故 GBK 亦不收)。

10.从 GB 13000.1 的 CJK 兼容区挑选出的 21 个汉字。

11.GB 13000.1 收入的 31 个 IBM OS/2 专用符号。

12.未录入《新华字典》上的一些字,如“韡”的简体。


分配及顺序

GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。


全部编码分为三大部分:

1.汉字区,包括:

a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。

b. GB 13000.1 扩充汉字区。包括:

(1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。

(2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。

2. 图形符号区。包括:

a. GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。

b. GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个。

3. 用户自定义区:分为(1)(2)(3)三个小区

(1) AAA1-AFFE,码位 564 个。

(2) F8A1-FEFE,码位 658 个。

(3) A140-A7A0,码位 672 个。

第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。


字形

GBK 对字形作了如下的规定:

1.原则上与 GB 13000.1 G列(即源自中国大陆法定标准的汉字)下的字形/笔形保持一致。

4. 在 CJK 汉字认同规则的总框架内,对所有的 GBK 编码汉字实施“无重码正形”(“GB 化”);即在不造成重码的前提下,尽量采用中国新字形。

5. 对于超出 CJK 汉字认同规则的、或认同规则尚未明确规定的汉字,在 GBK 码位上暂安放旧字形。这样,在许多情况下 GBK 收入了同一汉字的新旧两种字形。

6. 非汉字符号的字形,凡 GB 2312 已经包括的,与 GB 2312 保持一致;超出 GB 2312 的部分,与 GB 13000.1 保持一致。

7. 带声调的拼音字母取半角形式。


GBK 代码集字符定义表部分

想看完整的GBK 代码集字符定义表,可以去 这里,或者自己百度。


81 0 1 2 3 4 5 6 7 8 9 A B C D E F

4 丂 丄 丅 丆 丏 丒 丗 丟 丠 両 丣 並 丩 丮 丯 丱

5 丳 丵 丷 丼 乀 乁 乂 乄 乆 乊 乑 乕 乗 乚 乛 乢

6 乣 乤 乥 乧 乨 乪 乫 乬 乭 乮 乯 乲 乴 乵 乶 乷

7 乸 乹 乺 乻 乼 乽 乿 亀 亁 亂 亃 亄 亅 亇 亊

8 亐 亖 亗 亙 亜 亝 亞 亣 亪 亯 亰 亱 亴 亶 亷 亸

9 亹 亼 亽 亾 仈 仌 仏 仐 仒 仚 仛 仜 仠 仢 仦 仧

A 仩 仭 仮 仯 仱 仴 仸 仹 仺 仼 仾 伀 伂 伃 伄 伅

B 伆 伇 伈 伋 伌 伒 伓 伔 伕 伖 伜 伝 伡 伣 伨 伩

C 伬 伭 伮 伱 伳 伵 伷 伹 伻 伾 伿 佀 佁 佂 佄 佅

D 佇 佈 佉 佊 佋 佌 佒 佔 佖 佡 佢 佦 佨 佪 佫 佭

E 佮 佱 佲 併 佷 佸 佹 佺 佽 侀 侁 侂 侅 來 侇 侊

F 侌 侎 侐 侒 侓 侕 侖 侘 侙 侚 侜 侞 侟 価 侢


FD 0 1 2 3 4 5 6 7 8 9 A B C D E F

4 鼲 鼳 鼴 鼵 鼶 鼸 鼺 鼼 鼿 齀 齁 齂 齃 齅 齆 齇

5 齈 齉 齊 齋 齌 齍 齎 齏 齒 齓 齔 齕 齖 齗 齘 齙

6 齚 齛 齜 齝 齞 齟 齠 齡 齢 齣 齤 齥 齦 齧 齨 齩

7 齪 齫 齬 齭 齮 齯 齰 齱 齲 齳 齴 齵 齶 齷 齸

8 齹 齺 齻 齼 齽 齾 龁 龂 龍 龎 龏 龐 龑 龒 龓 龔

9 龕 龖 龗 龘 龜 龝 龞 龡 龢 龣 龤 龥 郎 凉 秊 裏

A 隣               

B                

C                

D                

E                

F               


FE 0 1 2 3 4 5 6 7 8 9 A B C D E F

4 兀 嗀 﨎 﨏 﨑 﨓 﨔 礼 﨟 蘒 﨡 﨣 﨤 﨧 﨨 﨩

5                

6                

7               

8                

9                

A                

B                

C                

D                

E                

F               


通过上面3部分的编码我们发现,确实都剔除 xx7F 一条线

总体编码范围 8140-FEFE ,总计 23940 个码位

81 - FE     40 - FE
FE 转化而为十进制为 254, 
81 转化而为十进制为 129, 
40 转化而为十进制为 64, 

23940 = (254 - 129 + 1)* (254 - 64 + 1) - ( xx7F 一条线 数量) 
	= 126 * 191 - (254 - 129 + 1) 
	= 24066 - 126 = 23940


GB 18030

GB 18030,全称《信息技术 中文编码字符集》,是中华人民共和国国家标准所规定的变长多字节字符集。其对GB 2312-1980完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位。GB 18030共收录汉字70,244个。


GB 18030的特点

GB 18030主要有以下特点 :

采用变长多字节编码,每个字可以由1个、2个或4个字节组成。

编码空间庞大,最多可定义161万个字符。

完全支持Unicode,无需动用造字区即可支持中国国内少数民族文字、中日韩和繁体汉字以及emoji等字符。


概念简介

国家标准GB18030-2000《信息交换用汉字编码字符集基本集的补充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。


GB18030-2000编码标准是由信息产业部和国家质量技术监督局在2000年 3月17日联合发布的,并且将作为一项国家标准在2001年的1月正式强制执行。


GB18030-2005《信息技术中文编码字符集》是我国制订的以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准,其中收入汉字70000余个。


标准要求

GB 18030 的当前版本为 GB 18030-2005。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,2006年5月1日实施;是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。 本规格的初版“GB 18030-2000《信息技术 信息交换用汉字编码字符集 基本集的扩充》”是由中华人民共和国信息产业部电子工业标准化研究所起草,由国家质量技术监督局于2000年3月17日发布。在GBK基础上增加了CJK统一汉字扩充A的汉字。

此标准内的单字节编码部分、双字节编码部分,和四字节编码部分收录的少数中日韩统一表意文字扩展A区汉字,为强制性标准。其他部分则属于规模性标准。在中华人民共和国境内所有软件产品,都需要支持这个同时包含单字节、双字节和四字节编码的规格。


Unicode支持

GB 18030在其标准中以码表形式定义了除去代理对外的全部Unicode码位的定义,因此算得上是一种Unicode的变换格式(UTF)。由于GB 18030基本上是绕开已分配的码点去指定需要对应的Unicode,其变换和UTF-8相比要复杂得多。在日常实现上,常常会直接使用一个偏移量表 。


GB 18030—2005与GB18030—2000、GBK相比,去除了很多原来映射在PUA中的编码。后来剩余的24个PUA码位也在Unicode 4.1中加上,如下所示。

1.png

总体结构

标准采用单字节、双字节和四字节三种方式对字符编码。

单字节部分,采用GB/T 11383的编码结构与规则,使用0×00至0×7F码位(对应于ASCII码的相应码位)。

双字节部分,首字节码位从0×81至0×FE,尾字节码位分别是0×40至0×7E和0×80至0×FE。

四字节部分,采用GB/T 11383未采用的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。


汉字

GB18030-2000汉字 如下表所示,GB18030-2000收录了27533个汉字:

2.png

27533就是6763+6080+8160+653。

双字节部分的6763+6080+8160=21003个汉字就是GBK的21003个汉字。


在Unicode中,CJK统一汉字扩充A有6582个汉字,为什么这里只有6530个汉字?

这是因为在GBK时代,双字节部分已经收录过CJK统一汉字扩充A的52个汉字,所以还余6530个汉字。


GB18030-2005汉字 如下表所示,GB18030-2005收录了70244个汉字:

3.png

70244就是6763 + 6080 + 8160 + 6530 + 42711。


字节结构

GB 18030包含三种长度的编码:单字节的ASCII、双字节的GBK(略带扩展)、以及用于填补所有Unicode码位的四字节UTF区块。GBK双字节部分通过查表定义,而四字节部分则根据之前两个部分没有提到的通用字符集码位顺序填补。由于和GBK兼容,GB 18030在搜索ASCII字符时也需要使用特别代码进行判断。

4.png

一、二字节区块基本就是GBK编码,另外加上了专门的欧元字符、竖排版本的标点符号,以及造字区对Unicode造字区的对应。四字节区块可以视作两段形似GBK二字节区块结构的部分,每段的第一字节可以为0x81到0xFE,第二字节为0x30到0x39。由于结构类似,能够安全于GBK的字符串搜索程序对于GB 18030来说也基本安全(正如基于字节的搜索程序对于EUC、UTF-8也基本安全一般。)


四字节区块总共可以表达1,587,600(126×10×126×10)种字符,足以覆盖Unicode的1,112,064(17×65536 − 2048个代理对)个有效码位。

1,587,600(126×10×126×10)
126怎么来的呢? FE - 81 对应的十进制为 254-129 = 125 + 1
10 怎么来的呢? 39 - 30 对应的十进制为 57 - 48 = 9 + 1 
为什么是126×10×126×10 ? 范围为 0×81308130 到 0×FE39FE39。
其中第一、三个字节编码码位均为0×81至0×FE,第二、四个字节编码码位均为0×30至0×39。

由于四字节区块通过填空定义,要写出处理这段转换的程序需要同时知道GBK的覆盖范围,并不简单:

U+00DE (Þ) → 81 30 89 37U+00DF (ß) → 81 30 89 38U+00E0 (à) → A8 A4U+00E1 (á) → A8 A2U+00E2 (â) 
→ 81 30 89 39U+00E3 (ã) → 81 30 8A 30

WHATWG和W3C的GB 18030实现通过一张“位置偏移表”记录GB 18030四字节区中连续的几块碎片,以便高效处理转换。ICU和glibc也都对大块连续的区域使用了类似的策略。


版本

GB 18030-2000,兼容Unicode 3.0中日韩统一表意文字(即扩展A区),共收27,533个汉字;2000年3月17日发布、2000年7月1日实施。

GB 18030-2005,更新至Unicode 3.1中日韩统一表意文字(即扩展B区),并刊载少数民族包括朝鲜文、蒙古文(包括满文、托忒文、锡伯文、阿礼嘎礼文)、德宏傣文、藏文、维吾尔文/哈萨克文/柯尔克兹文和彝文的文字。共有70,244个汉字;2005年11月8日发布、2006年5月1日实施。


版本区别

GB18030最新版本是GB18030-2005。GB18030-2005与GB18030-2000的编码体系结构是完全相同的。那么,GB18030的2000版和2005版有什么区别和联系呢?


2000年发布的GB18030-2000,全名是《信息技术 汉字编码字符集 基本集的扩充》。GB18030-2000仅规定了常用非汉字符号和27533个汉字(包括部首、部件等)的编码。


GB18030-2000是全文强制性标准,市场上销售的产品必须符合。2005年发布的GB18030-2005在GB18030-2000的基础上增加了42711个汉字和多种我国少数民族文字的编码,增加的这些内容是推荐性的。

GB18030-2000中的内容是强制性的,市场上销售的产品必须符合。

GB18030-2005为部分强制性标准,自发布之日起代替GB18030-2000。GB18030-2005的单字节编码部分、双字节编码部分和四字节编码部分的CJK统一汉字扩充A(即0x8139EE39—0x82358738)部分为强制性。