观点

必威手机客户端刨根究底字符编码之六——简体汉字编码中区位码、

字号+ 作者:betway必威登陆平台 来源:未知 2017-12-21 19:44 我要评论( )

betway必威登陆平台是亚洲最大的网上体育游戏投注平台,必威手机客户端欢迎您的加入,betway必威注册这里会有不一样的体验。 GB2312、GBK、GB18030等GB类汉字编码方案的具体实现体例是如何的?区位码是什么?国标码是什么?内码、外码、字形码又是什么意义?它

betway必威登陆平台是亚洲最大的网上体育游戏投注平台,必威手机客户端欢迎您的加入,betway必威注册这里会有不一样的体验。

  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个全角字符;

  因而,必需将“区码”和“位码”别离加上32(十六进制为20H,后缀H暗示十六进制),做为国标码。也就是说,国标码相当于将区位码向后偏移了32,以避免取ASCII字符中0~32的不成显示字符和空格字符相冲突。

  留意,国标码中是别离将区位码中的“区”和“位”各自加上32(20H)的,由于GB2312是DBCS双字节字符集,国标码属于双字节码,“区”和“位”各做为一个零丁的字节。

  不外国标码还不克不及间接正在计较机上利用,由于如许仍是会和早已通用的ASCII码冲突(导致乱码)。

  好比,“万”字国标码中的高位字节77取ASCII的“M”冲突,低位字节114取ASCII的“r”冲突。因而,为避免取ASCII码冲突,划定国标码中的每个字节的最高位都从0换成1,即相当于每个字节都再加上128(十六进制为80,即80H;二进制为1000 0000),从而获得国标码的“机内码”暗示,简称“内码”。

  因为ASCII码只用了一个字节中的低7位,所以,这个首位(最高位)上的“1”就能够做为识别汉字编码的标记,计较机正在处置到首位是“1”的编码时就把它理解为汉字,正在处置到首位是“0”的编码时就把它理解为ASCII字符。

  我们能够来查验一下。打开记事本输入“万”字,编码选择为ANSI(Windows记事本中的ANSI编码对于简体汉字而言就是GB类编码,详见后文注释),保留,如下图所示。

  然后用二进制编纂器(好比UltraEdit)打开适才保留的文件,切换到十六进制模式,会看到:CD F2,这就是“万”字的内码,如下图所示。

  因而,区位码的区和位别离+160(即+A0H,32+128=160)可间接获得内码。用十六进制暗示就是:

  起首,需要留意到一点,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码。这也是为什么国标码还要加上(80H,80H)才能获得机内码的缘由。

  看到这里,有人大概又要问了:若是仅仅是为了避免取ASCII编码相冲突,为什么最后不间接将区位码的区码和位码的最高位从0改为1(相当于各自间接加上128),如许不就无需颠末国标码画蛇添足的两头转换了吗?并且还无需后移32,也就不消华侈这部门编码空间。

  对此本人也很迷惑,正在网上搜了好久也没找到谜底,因而具体缘由不得而知。大概是一起头考虑不周?大概为了将来扩展所需而预留一部门空间?又大概是有其他不得已的缘由?有晓得的伴侣还望能指导迷津。

  外码也叫输入码、输入法编码,是用来将汉字输入到计较机中的一组键盘符号,是做为汉字输入用的编码。

  英文字母只要26个,能够把所有的字符都放到键盘上,而利用这种法子把所有的汉字都放到键盘上,是不成能的。所以汉字系统需要有本人的输入码系统,使汉字取键盘能成立对应关系。

  为了将汉字正在显示器或打印机上输出,把汉字按图形符号设想成点阵图,就获得了响应的点阵代码(字形码)。

  也就是用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字节。

  明显,字形码所暗示的字符,相对于笼统字符表ACR里的“笼统”字符,可称之为“具体”字符,由于具有了“具体”的外形。

  为了将汉字的字形显示输出或打印输出,汉字消息处置系统还需要配有汉字字形库,也称字模库,简称字库,它集中了汉字的字形消息。

  字库按输出体例可分为显示字库和打印字库。用于显示输出的字库叫显示字库,工做时需调入内存。用于打印输出的字库叫打印字库,工做时无需调入内存。

  字库按存储体例也可分为软字库和硬字库。软字库以文件的形式存放正在硬盘上,现多用这种体例。硬字库则将字库固化正在一个零丁的存储芯片中,再和其它需要的器件构成接口卡,插接正在计较机上,凡是称为汉卡。这种体例现已裁减。

  能够如许理解,为正在计较机内暗示汉字而采纳同一的编码体例所构成的汉字编码叫内码。为便利汉字输入而构成的汉字编码为外码,也叫输入码。为显示输出和打印输出汉字而构成的汉字编码为字形码,也称为字模码、输出码。

  计较机通过键盘输入的外码(沉码时还需附加选择编号)对应于汉字内码,将汉字外码转换(即映照)为汉字内码,以实现输入汉字的目标;通过汉字内码正在字模库(即字库)中找出汉字的字形码,将汉字内码转换(即映照)为汉字字形码,以实现显示输出和打印输出汉字的目标。

  现实上,英文字符的输入、处置和显示过程大致上也差不多,只不外英文字符不需要输入码(即外码),间接正在键盘上输入对应的英文字母即可。

  【预告:下一篇将沉点分解很是容易令人迷惑的所谓ANSI编码取代码页(Code Page),敬请关心!】

  上一篇:刨根究底字符编码之五--简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK

转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评