汉字编码中区位码、国标码和机内码的区别

区码和位码分别加20H后转换成内码

例如:区位码5448,其中区码54(十六进制36H)位码48(十六进制30H)

36H+20H->56H,30H+20H->50H,所以该字国标码为5650H



  每个汉字有个二进制编码,叫汉字国标码

  在我国汉字代码标准 GB2312-80 中有6763个常用汉字规定了二进制编码。
  每个汉字使用2个 字节
  GB2312-80  GB2312 将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(20H),因此也称为 区位码 。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计 3755个,置于16-55区,按汉语 拼音字母 /笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按 部首 / 笔画 顺序排列。故而 GB2312最多能表示6763个汉字。

输入码、区位码、国标码与机内码

  输入码、 区位码 国标码 机内码 ,这些字对每一位computer fan 来说,可能都不陌生,但其中的联系与区别,可能就不那么清楚了,(笔者作为一名中专电脑教师,经常遇到同学问类似的问题),下面就这问题讲述一下,以飨读者。
  我们知道,键盘是当前微机的主要 输入设备 ,;输入码就是使用英文键盘输入 汉字 时的编码。目前,我国已推出的输入码有数百种,但用户使用较多的约为十几种,按输入码编码的主要依据,大体可分为 顺序码 、音码、形码、音形码四类,如“保”?字,用 全拼 ,输入码为码为“BAO”,用区位码,输入码为“1703”,用 五笔字型 则为“WKS”。
  计算机只识别由0、1组成的代码, ASCII 码是英文 信息处理 的标准编码,汉字信息处理也必须有一个统一的标准编码。我国国家标准局于1981年5月颁布了《信息交换用汉字编码 字符 集——基本集》,代号为GB2312-80,共对6763个汉字和682个图形字符进行了编码,其编码原则为:汉字用两个 字节 表示,每个字节用七位码(高位为0),;国家标准将汉字和图形符号排列在一个94行94列的二维代码表中,;每两个字节分别用两位十进制编码,前字节的编码称为区码,后字节的编码称为位码,此即区位码,;如“保”字在二维代码表中处于17区第3位,区位码即为“1703 ”。
  国标码并不等于区位码,它是由区位码稍作转换得到,其转换方法为:先将十进制区码和位码转换为 十六进制 的区码和位码,;这样就得了一个与国标码有一个相对位置差的代码,;再将这个代码的第一个字节和第二个字节分别加上20H,就得到国标码。如:“保”?字的国标码为3123H,它是经过下面的转换得到的:1703D->1103H->+20H->3123H。 国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突,如“保”?字,国标码为31H和23H,而西文字符“1”和“#”的ASCII也为31H和23H,现假如 内存 中有两个字节为31H和23H,;这到底是一个汉字?,还是两个西文字符“1”;和“#”?于是就出现了 二义性 ,显然,国标码是不可能在计算机内部直接采用的,于是,;汉字的机内码采用变形国标码,其变换方法为:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变,如:由上面我们知道,“保”字的国标码为3123H,前字节为00110001B,后字节为00100011B,高位改1为10110001B和10100011B 即为B1A3H,因此,汉字的机内码就是B1A3H。

  显然,汉字机内码的每个字节都大于128,这就解决了与西文字符的ASCII码冲突的问题。 如上所述,汉字输入码、区位码、国标码与机内码都是汉字的编码形式,它们之间有着千丝万缕的联系,但其间的区别也是不容忽视的。


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

编辑本段具体解释

  汉字在计算机内部其内码是唯一的。因为汉字处理 系统 要保证中西文的兼容,当系统中同时存在 ASCII码 和汉字 国标码 时,将会产生二义性。例如:有两个字节的内容为30H和21H,它既可表示汉字“啊”的国标码,又可表示西文“0”和“!”的ASCII码。为此,汉字机内码应对国标码加以适当处理和变换。
  国标码的机内码为二 字节 长的代码,它是在相应国标码的每个字节最高位上加“1”,即
  汉字机内码= 汉字国标码 +8080H
  例如,上述“啊”字的国标码是3021H,其汉字机内码则是B0A1H。
  汉字机内码的基础是汉字国标码。
  机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。
  汉字机内码、国标码和 区位码 三者之间的关系为:区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。
  举例:机内码位BEDF,求区位码?
  有两种解法:1.BEDFH-A0A0H=1E3FH=3063D;
  2.BEDFH-8080H=3E5FH(国标码),3E5FH-2020H=1E3FH=3063D.


ASCII码转汉字区位码:

ascii 从惊叹号起到波浪号止(0x21 到 0x7e) 用公式:
int ascii,qw;
qw = ascii - 0x21 + 301;
printf("%04d",qw);


你可能感兴趣的:(图形)