GB2312、GBK、GB18030等GB类汉字编码方案的具体实現方式是怎样的区位码是什么?国标码是什么内码、外码、字形码又是什么意思?它们是如何转换的又为什么要这样转换?
下面以GB2312為例来加以说明(由于GBK、GB18030是以GB2312为基础扩展而来因此编码实现方式与GB2312一样)。
整个GB2312汉字字形码字符编码集分成94个区每区有94个位,每个区位上呮有一个汉字字形码字符编码即每区含有94个汉字或符号,用所在的区和位来对汉字字形码字符编码进行编码(实际上就是汉字字形码字符編码编号、码点编号)因此称为区位码(或许叫“区位号”更为恰当)。
换言之GB2312将包括汉字在内的所有汉字字形码字符编码编入一个94 * 94的二维表,行就是“区”、列就是“位”每个汉字字形码字符编码由区、位唯一定位,其对应的区、位编号合并就是区位码比如“万”字在45區82位,所以“万”字的区位码是:45 82(注意GB类汉字编码为双字节编码,因此45相当于高位字节,82相当于低位字节)
1)01~09区(682个):特殊符号、數字、英文汉字字形码字符编码、制表符等,包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母等在内的682个全角汉字芓形码字符编码;
2)10~15区:空区留待扩展;
3)16~55区(3755个):常用汉字(也称一级汉字),按拼音排序;
4)56~87区(3008个):非常用汉字(也称二级汉字)按部首/笔畫排序;
5)88~94区:空区,留待扩展
为了避开ASCII汉字字形码字符编码中的不可显示汉字字形码字符编码 ~ (十六进制为0 ~ 1F,十进制为0 ~ 31)及空格汉字字形碼字符编码(十六进制为20十进制为32)(至于为什么要避开、又为什么只避开ASCII中0~32的不可显示汉字字形码字符编码和空格汉字字形码字符编码,後文有解释)国标码(又称为交换码)规定表示汉字的范围为(,) ~
因此必须将“区码”和“位码”分别加上32(十六进制为20H,后缀H表示十六进制)作为国标码。也就是说国标码相当于将区位码向后偏移了32,以避免与ASCII汉字字形码字符编码中0~32的不可显示汉字字形码字符编码和空格汉芓字形码字符编码相冲突
注意,国标码中是分别将区位码中的“区”和“位”各自加上32(20H)的因为GB2312是DBCS双字节汉字字形码字符编码集,国标碼属于双字节码“区”和“位”各作为一个单独的字节。
这样我们可以算出“万”字的国标码十进制为:(45+3282+32) = (77,114)十六进制为:(4D,72H)二进淛为:(,)
(笨笨阿林原创文章,转载请注明出处)
不过国标码还不能直接在计算机上使用因为这样还是会和早已通用的ASCII码冲突(导致乱碼)。
比如“万”字国标码中的高位字节77与ASCII的“M”冲突,低位字节114与ASCII的“r”冲突因此,为避免与ASCII码冲突规定国标码中的每个字节的最高位都从0换成1,即相当于每个字节都再加上128(十六进制为80即80H;二进制为),从而得到国标码的“机内码”表示简称“内码”。
由于ASCII码只用叻一个字节中的低7位所以,这个首位(最高位)上的“1”就可以作为识别汉字编码的标志计算机在处理到首位是“1”的编码时就把它理解為汉字,在处理到首位是“0”的编码时就把它理解为ASCII汉字字形码字符编码
我们可以来检验一下。打开记事本输入“万”字编码选择为ANSI(Windows記事本中的ANSI编码对于简体汉字而言就是GB类编码,详见后文解释)保存,如下图所示
然后用二进制编辑器(比如UltraEdit)打开刚才保存的文件,切换箌十六进制模式会看到:CD F2,这就是“万”字的内码如下图所示。
因此区位码的区和位分别+160(即+A0H,32+128=160)可直接得到内码用十六进制表示就昰:
四、为什么要加上20H和80H?
区位码、国标码、内码的转换非常简单但是令人迷惑的是为什么要这么转换?
首先需要注意到一点,GB2312虽说昰对中文编码但是里面也有对26个英文字母和一些特殊符号的编码,按理说这些和ASCII重合的汉字字形码字符编码(33~127)应该无需再重新编码直接沿用ASCII中的不就行了?
原来当时在制定GB2312时,决定对ASCII中的可打印汉字字形码字符编码也就是英文字母、数字和符号部分(33~126,127为不可打印的DEL)重噺编入GB2312中以两个字节表示,称之为全角汉字字形码字符编码(全角汉字字形码字符编码在屏幕上的显示宽度为ASCII汉字字形码字符编码的两倍后来也因此而将对应的ASCII汉字字形码字符编码称之为半角汉字字形码字符编码)。
而对于ASCII中前32个不可显示也不可打印的控制汉字字形码字符編码(ASCII码为0~31)以及第33个可显示但不可打印的空格汉字字形码字符编码(ASCII码为32)等共33个不可打印汉字字形码字符编码的编码则直接沿用,不再重新編码
因为要保留这33个不可打印汉字字形码字符编码,就不能直接采用区位码作为计算机直接处理的机内码需要将区位码向后偏移32以避開冲突(为什么是偏移32,而不是偏移33因为区位码中的区码和位码都是从1开始计数的,不像ASCII码是从0开始计数的)
十进制数字32的十六进制表示僦是20(为区别于十进制,记作20H)这也就是区位码要加上20H(区码和位码各自加上20H)才能得到国标码的原因。
(笨笨阿林原创文章转载请注明出处)
很显然,如果直接采用国标码作为计算机直接处理的机内码的话还将会产生另一个弊端,即用ASCII码编码的英文汉字字形码字符编码在GB2312编碼环境中无法打开一打开就会乱码。
因为国标码虽然相较于区位码避开了ASCII码中0~32的前33个不可打印汉字字形码字符编码但并没有避开ASCII码中嘚英文字母、数字和符号(33~126,共94个汉字字形码字符编码127为不可打印的DEL)等可打印汉字字形码字符编码。也就是说国标码并不是完全兼容ASCII码嘚。
为了解决这个弊端考虑到ASCII码只使用了一个字节中的低7位,最高位(即首位)为0于是决定将国标码每个字节的最高位设为1(国标码的两个芓节中的最高位都恒为0,即国标码中的每个字节实际上也只用了一个字节中的低7位)这就是GB2312的机内码(即内码),简称GB2312码
这样一来就彻底区汾开了ASCII码和GB2312码。这也是为什么国标码还要加上(80H80H)才能得到机内码的原因。
看到这里有人或许又要问了:如果仅仅是为了避免与ASCII编码相冲突,为什么最初不直接将区位码的区码和位码的最高位从0改为1(相当于各自直接加上128)这样不就无需经过国标码多此一举的中间转换了吗?洏且还无需后移32也就不用浪费这部分编码空间。
对此本人也很困惑在网上搜了很久也没找到***,因此具体原因不得而知或许是一開始考虑不周?或许为了未来扩展所需而预留一部分空间又或许是有其他不得已的原因?有知道的朋友还望能指点迷津
GB2312区位码、国标碼、内码对照表(其中汉字内码B0A1~F7FE,共6763个)
五、外码(输入码、输入法编码)
外码也叫输入码、输入法编码是用来将汉字输入到计算机中的一组键盤符号,是作为汉字输入用的编码
英文字母只有26个,可以把所有的汉字字形码字符编码都放到键盘上而使用这种办法把所有的汉字都放到键盘上,是不可能的所以汉字系统需要有自己的输入码体系,使汉字与键盘能建立对应关系
目前常用的外码分为以下几类:
1)数芓编码,比如区位码;
2)拼音编码比如全拼、双拼、自然码等;
3)字形编码,比如五笔、表形码、郑码等
六、字形码(字型码、字模码、输出码)
字形码,又称为字型码、字模码、输出码属于点阵代码的一种。
为了将汉字在显示器或打印机上输出把汉字按图形符号设计荿点阵图,就得到了相应的点阵代码(字形码)
也就是用0、1表示汉字的字形,将汉字放入n行*n列的正方形(点阵)内该正方形共有n^2个小方格,每個小方格用一位二进制表示凡是笔划经过的方格值为1,未经过的值为0
显示一个汉字一般采用16×16点阵或24×24点阵或48×48点阵。已知汉字点阵嘚大小可以计算出存储一个汉字所需占用的字节空间。
比如用16×16点阵表示一个汉字,就是将每个汉字用16行每行16个点表示,一个点需偠1位二进制代码16个点需用16位二进制代码(即2个字节),共16行所以需要16行×2字节/行=32字节,即16×16点阵表示一个汉字字形码需用32字节。
因此芓节数=点阵行数×(点阵列数/8)。
显然字形码所表示的汉字字形码字符编码,相对于抽象汉字字形码字符编码表ACR里的“抽象”汉字字形码字苻编码可称之为“具体”汉字字形码字符编码,因为具有了“具体”的外形
为了将汉字的字形显示输出或打印输出,汉字信息处理系統还需要配有汉字字形库也称字模库,简称字库它集中了汉字的字形信息。
字库按输出方式可分为显示字库和打印字库用于显示输絀的字库叫显示字库,工作时需调入内存用于打印输出的字库叫打印字库,工作时无需调入内存
字库按存储方式也可分为软字库和硬芓库。软字库以文件的形式存放在硬盘上现多用这种方式。硬字库则将字库固化在一个单独的存储芯片中再和其它必要的器件组成接ロ卡,插接在计算机上通常称为汉卡。这种方式现已淘汰
可以这样理解,为在计算机内表示汉字而采取统一的编码方式所形成的汉字編码叫内码为方便汉字输入而形成的汉字编码为外码,也叫输入码为显示输出和打印输出汉字而形成的汉字编码为字形码,也称为字模码、输出码
计算机通过键盘输入的外码(重码时还需附加选择编号)对应于汉字内码,将汉字外码转换(即映射)为汉字内码以实现输入汉芓的目的;通过汉字内码在字模库(即字库)中找出汉字的字形码,将汉字内码转换(即映射)为汉字字形码以实现显示输出和打印输出汉字的目的。
事实上英文汉字字形码字符编码的输入、处理和显示过程大致上也差不多,只不过英文汉字字形码字符编码不需要输入码(即外码)直接在键盘上输入对应的英文字母即可。
(笨笨阿林原创文章转载请注明出处)
【预告:下一篇将重点剖析非常容易令人困惑的所谓ANSI編码与代码页(Code Page),敬请关注!】
这字形码是最基本的了凡是学單片机的人都知道的,而且自己也可算出来的
不只是0,就是十进制数的10个数码的字形码都应该知道的
如下,就是0-9的十个数的字形码吔叫段码。
那第一个就是0的字形码了
GB 前 言 GB17698依据GB13000.1的基本平面中工区所提供的汉字汉字字形码字符编码以我国规范字形为基础并按照 整理汉字字形的原则,具体地设计和规定了汉字信息系统用16点阵字型 GB17698规定叻GB13000.1中G列汉字汉字字形码字符编码的16点阵字型,若G列位置空缺字则递补T,J,K 列的汉字,并加外框线标识 本标准的附录A和附录B是标准的附录;附錄C和附录D是提示的附录。 本标准由中华人民共和国电子工业部提出 本标准由电子工业部标准化研究所归口, 本标准起草单位;电子工业部標准化研究所、第二炮兵第二研究所 本标准起草人周济萍、翟广臣、王利剑、向维良、刘庆隆、华蔚苍、戴涌、杨宝铭、田成锋、冯敬、白静 中华人民共和 国国家标准 信息技术 通用多八位编码汉字字形码字符编码集(I区) 汉字16点阵字型 下列标准所包含的条文,通过在本标准中引用而构成本标准的条文本标准出版时,所示版本均为 有效所有标准都会被修订,使用本标准的各方应探讨使用下列标准最新版本的鈳能性 GB3信息技术 通用多八位编码汉字字形码字符编码集(UCS)第一部分:体系结构与基本多文 种平面 《简化字总表》1964年3月7日 中国文字改革委员会、Φ华人民共和国文化部、中华人民共和 国教育部 《第一批异体字整理表》 1955年12月22日 中华人民共和国文化部、中国文字改革委员会 3 定义 本标准采用下列定义 3.1字形 glyph 一个可辨认的抽象的图形符号,它不依赖于任何特定的设计 3.2 字型 font 具有同一基本设计的字形图像的集合,如:书版宋体 3.3 点阵字型 dotmatrixfont 以点的集合来表现图形汉字字形码字符编码的形。 3.4 字序 characterorder 汉字在一定的集合中按一定规则排列的次序 4 点阵字型的排列次序 本标准按GB13000.1的编码顺序排列各汉字点阵字型的字序。 5 点阵字型的表示方法 5.1 栅格 国家质A技术监督局1999一03一18批准 1999一10一01实施 GB 栅格由若干条等距离的垂直线與水平线相交叉而形成 本标准规定的是16点阵字型其栅格是横向16格,纵向16格每个方格的中心定为点的中心位 置 0 栅格仅对构成点阵字型的各点进行定位,16点阵的栅格如图1所示: 图 1 栅格图 5 户 八 ‘ 占 点是构成点阵字型的最小单位以圆形表示,它是位于各方格内的黑色区域 5.3 字样 漢字点阵字型的字样,由置于栅格内的若干个点的集合来表示汉字 “亘”的点阵字样如图2所示: 门尸 口r 田 图2 16点阵汉字 “亘”字模 6 汉字点阵芓型 6.1 字数 本标准按GB13000.1提供了20902个汉字的16点阵字型。同时增补了简《化字总表》中的52个简 化字和繁体字(见附录A)的16点阵字型 6.2 汉字字型数据 汉字16点阵芓型数据的表示见附录B.