分享

GB2312汉字机内码、国标码和区位码教程 [原创推荐] - 江边鸟的日志 - 网易博客

 护法使者 2011-03-02
GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

卷首语:互联、开放、共享、自由、技术。                          

------作者·江边鸟

做学问不要小看任何一个不起眼的知识点。  

本文部分摘自互联网,另一部分为原创;欢迎共同学习、交流。旨在为广大朋友提供思想,即使没有计算机基础的朋友也能根据步骤进行计算。

GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

一、相关解析:

汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。

汉字在计算机内部其内码是唯一的。因为汉字处理系统要保证中西文的兼容,当系统中同时存在ASCII码和汉字国标码时,将会产生二义性。例如:有两个字节的内容为30H和21H,它既可表示汉字“啊”的国标码,又可表示西文“0”和“!”的ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。

GB码的机内码为二字节长的代码,它是在相应GB码的每个字节最高位上加“1”,即

汉字机内码=汉字国标码+8080H

例如,上述“啊”字的国标码是3021H,其汉字机内码则是B0A1H。

汉字机内码的基础是汉字国标码。

机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。

汉字机内码、国标码和区位码三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。

举例:机内码位BEDF,求区位码?

有两种解法:1.BEDFH-A0A0H=1E3FH=7743D;   

2.BEDFH-8080H=3E5FH(国标码),3E5FH-2020H=1E3FH=7743D。

GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

二、扩展补充:

为了适应计算机处理汉字信息的需要,1981年我国颁布了GB2312国家标准。该标准选出6763个常用汉字(其中,一级常用汉字3755个,二级汉字3008个)和682个非汉字字符,并为每个字符规定了标准代码,以便在不同的计算机系统之间进行汉字文本交换。

GB2312字符集构成一个94行、94列的二维表,行号称为区号,列号称为位号,每一个汉字或符号在码表中的位置用它所在的区号和位号来表示。

为了处理与存储的方便,每个汉字的区号和位号在计算机内部分别用一个字节来表示。例如,“学”字的区号为49,位号为07,它的区位码即为4907,用2个字节的二进制数表示为:

00110001 00000111

区位码无法用于汉字通信,因为它可能与通信使用的控制码(00H~1FH)(即0~31)发生冲突。ISO2022规定每个汉字的区号和位号必须分别加上32(即二进制数00100000),经过这样的处理而得的代码称为国标交换码,简称国标码或交换码,因此,“学”字的国标交换码计算为:

00110001      00000111

+00100000   +00100000

-----------------------------------

01010001      00100111

用十六进制数表示即为5127H。

由于文本中通常混合使用汉字和西文字符,汉字信息如果不予以特别标识,就会与单字节的ASCII码混淆。此问题的解决方法之一是将一个汉字看成是两个扩展ASCII码,使表示GB2312汉字的两个字节的最高位都为1。这种高位为1的双字节汉字编码即为GB2312汉字的机内码,简称为内码。

因此,“学”字的机内码为:

11010001 10100111

用16进制表示即为D1A7H。

最后要指出的是,汉字的输入编码与汉字的机内码是不同范畴的概念。不管采用什么样的编码输入法(例如拼音、五笔字型等)来输入一个汉字,其机内码都是相同的。

GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

三、计算方法与注意事项总结:

(1)、机内码、国标码和区位码都是两个字节的字符表示形式;机内码和国标码为十六进制,区位码为十进制标准码;

(2)、不同进制进行运算时,须先转化为同进制再运算;运算结果也是相同进制;根据编码标准进行相应转换,以得到最终结果;(特别注意:区位码参与运算,转化为十六进制;结果为十六进制,再次转化为十进制标准码;)

(3)、公式:汉字机内码=汉字国标码+8080H

汉字国标码=汉字区位码+2020H

变换:汉字区位码=汉字国标码-2020H

汉字国标码=汉字机内码-8080H

或公式:汉字区位码=汉字机内码-A0A0H

汉字机内码=汉字区位码+A0A0H

二进制反推法:(该公式须将所有运算数转化为二进制)

汉字机内码=汉字国标码(每字节)最高位加1

汉字国标码=汉字区位码(每字节)+00100000(即加32)

GB2312汉字机内码、国标码和区位码教程 - 江边鸟 - ☆彩云※追月☆

附:二进制反推法计算详解:

实例1:机内码为十六进制D147H,计算其国标交换码和区位码?

解题步骤:方法一(根据以上转换方法反推)

(机内码)十六进制      D147H

转换(机内码)二进制  11010001   01000111

最高位降1                        01010001   00100111

再次转换为十六进制    5127H     (即是国标交换码)

列出国标码二进制       01010001     00100111

两字节各减32 ,即减 00100000     00100000 

所得二进制为区位码    00110001     00000111    (即是区位码)

十六进制表示则为      3107H

区位码为十进制标准码,因此再转换为十进制为 4907。 

实例1:机内码为十六进制D0A3H,计算其国标交换码和区位码?

解题步骤:方法一(根据以上转换方法反推)

(机内码)十六进制      D0A3H

转换(机内码)二进制   11010000     10100011

最高位降1                         01010000     00100011

再次转换为十六进制    5023H     (即是国标交换码)

列出国标码二进制       01010000     00100011

两字节各减32 ,即减  00100000     00100000 

所得二进制为区位码   00110000     00000011    (即是区位码)

十六进制表示则为      3003H

区位码为十进制标准码,因此再转换为十进制为 4603。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多