用C++程序理解汉字的机内码表示

  汉字的编码是很多初学者不容易搞不明白的事情。最早的汉字字符集是GB2312-80,收入汉字6763个,符号715个,总计7478个字符,大陆普遍使用的简体字字符集。本文借助于一个能输出这些字符的简单的C++程序,体验汉字字符的编码。
  先简介一下GB2312-80的概况。
  1、区位码
  每个汉字及符号都有一个区位码,即每个汉字有一个区号(两位十进制)和一个位号(两位十进制)。一共分了94个区,每个区中有94个汉字。
  如下图了其中第1区和17区中的汉字:
    
  2、国标码
  汉字的国标码可以在区位码基础上换算得到:国标码=(区位码的十六进制表示)+2020H,国标码的取值范围:2121H~7E7EH。
  例如:“啊”的区码是16,位码为01,其区位码的十六进制表示为1001H,得到“啊”的国标码为:3021H。如下图:
   
  3、机内码
  中文或西文信息在计算机系统中的代码表示称为机内码。ASCII码是一种西文机内码,用一个字节表示,其最高位均为0。汉字机内码用连续两个字节表示,为能和ACSII符号区分,每个字节的最高位是1。机内码和国标码的转换规则是:机内码 = 国标码+8080H =(区位码的十六进制表示)+A0A0H。显然,就是将国标码的两个字节的最高位均置为1即可。
  例如,“啊”的国标码为:3021H,加上8080H后,其机内码为B0A1H,如下图所示:
   
  下面的程序,将GB2312-80中所有的汉字输出到一个文件中,对照上面的原理,读程序并运行,你将理解汉字在机器内部的表示。

(1)C++程序

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
    int i,j;
    char a[3];  //用两字节表示一个汉字,a[0]为第1个字节,a[1]为第2个字节
    a[2]='\0';  //a[2]固定为'\0',作为保存一个汉字的字符串的结束
    freopen("chineseChar.txt","w",stdout);   //将输出重定向到文件,便于查看结果
    for(i=1;i<=94;i++)    //区号从1到94
    {
        cout<<"=====第 "<<i<<" 区======"<<endl;
        a[0] = i + 0xA0;   //将第1个字节变为机内码
        for(j=1;j<=94;j++) //位号从1到94
        {
            a[1] = j + 0xA0; //将第2个字节变为机内码
            cout<<a<<'\t';   //输出a,里面有两字节,是i区j位汉字的机内码
            if(j%10==0)
                cout<<endl;  //每10个换一行
        }
        cout<<endl;
    }
    return 0;
}

(2)C程序

#include<stdio.h>
int main()
{
    int i,j;
    char a[3];  //用两字节表示一个汉字,a[0]为第1个字节,a[1]为第2个字节
    a[2]='\0';  //a[2]固定为'\0',作为保存一个汉字的字符串的结束
    freopen("chineseChar.txt","w",stdout);   //将输出重定向到文件,便于查看结果
    for(i=1;i<=94;i++)    //区号从1到94
    {
        printf("=====第 %d 区======\n",i);
        a[0] = i + 0xA0;   //将第1个字节变为机内码
        for(j=1;j<=94;j++) //位号从1到94
        {
            a[1] = j + 0xA0; //将第2个字节变为机内码
            printf("%s\r",a);   //输出a,里面有两字节,是i区j位汉字的机内码
            if(j%10==0)
                printf("\n");  //每10个换一行
        }
        printf("\n");
    }
    return 0;
}


  程序输出的所有汉字,见本文后附件。


  有了如上的知识,试运行下面的程序,看其结果是什么,并且试着做出解释。这是在处理汉字中常见的问题。
#include <iostream>
using namespace std;
int main()
{
    char a[]="汉字处理挺好玩";
    cout<<a<<endl;
    a[1]='a';
    cout<<a<<endl;
    a[2]='b';
    cout<<a<<endl;
    char b[10];
    b[8]='\0';
    cout<<b<<endl;
    return 0;
}


 

==================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

附件:程序输出的所有GB2312-80汉字和字符
=====第 1 区======
  · ˉ ˇ ¨


± × ÷


°
¤ §


=====第 2 区======










=====第 3 区======






_



=====第 4 区======










=====第 5 区======










=====第 6 区======
Α Β Γ Δ Ε Ζ Η Θ Ι Κ
Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ
Φ Χ Ψ Ω
α β γ δ ε ζ η θ
ι κ λ μ ν ξ ο π ρ σ
τ υ φ χ ψ ω
︿



=====第 7 区======
А Б В Г Д Е Ё Ж З И
Й К Л М Н О П Р С Т
У Ф Х Ц Ч Ш Щ Ъ Ы Ь
Э Ю Я
а б
в г д е ё ж з и й к
л м н о п р с т у ф
х ц ч ш щ ъ ы ь э ю
я

=====第 8 区======
ā á ǎ à ē é ě è ī í
ǐ ì ō ó ǒ ò ū ú ǔ ù
ǖ ǘ ǚ ǜ ü ê ɑ ń ň
ɡ






=====第 9 区======










=====第 10 区======










=====第 11 区======










=====第 12 区======










=====第 13 区======










=====第 14 区======










=====第 15 区======










=====第 16 区======










=====第 17 区======






便



=====第 18 区======


簿







=====第 19 区======






齿



=====第 20 区======
穿

椿


蹿




=====第 21 区======







殿


=====第 22 区======








饿

=====第 23 区======



仿 访


忿



=====第 24 区======




竿

稿



=====第 25 区======






广



=====第 26 区======







鸿


=====第 27 区======

怀




贿



=====第 28 区======










=====第 29 区======




轿





=====第 30 区======










=====第 31 区======








岿

=====第 32 区======










=====第 33 区======









窿
=====第 34 区======


鹿

绿





=====第 35 区======










=====第 36 区======








尿

=====第 37 区======










=====第 38 区======










=====第 39 区======










=====第 40 区======










=====第 41 区======










=====第 42 区======
湿

使


寿




=====第 43 区======






宿



=====第 44 区======










=====第 45 区======




退





=====第 46 区======








西

=====第 47 区======






线



=====第 48 区======








婿

=====第 49 区======





沿




=====第 50 区======

耀



亿




=====第 51 区======







屿


=====第 52 区======










=====第 53 区======










=====第 54 区======










=====第 55 区======




姿





=====第 56 区======
廿
丿








=====第 57 区======










=====第 58 区======



诿






=====第 59 区======










=====第 60 区======










=====第 61 区======










=====第 62 区======










=====第 63 区======










=====第 64 区======










=====第 65 区======










=====第 66 区======










=====第 67 区======










=====第 68 区======



涿






=====第 69 区======










=====第 70 区======






驿



=====第 71 区======










=====第 72 区======










=====第 73 区======



槿






=====第 74 区======










=====第 75 区======










=====第 76 区======










=====第 77 区======










=====第 78 区======










=====第 79 区======










=====第 80 区======










=====第 81 区======










=====第 82 区======










=====第 83 区======










=====第 84 区======






羿



=====第 85 区======



趿






=====第 86 区======




鱿





=====第 87 区======










=====第 88 区======










=====第 89 区======










=====第 90 区======










=====第 91 区======










=====第 92 区======










=====第 93 区======










=====第 94 区======











  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
汉字机内码获取实验是利用Logisim软件进行汉字机内码获取过程的模拟实验。Logisim是一款逻辑电路设计工具,可以用来模拟和验证电路的功能。 在开始实验之前,我们需要了解汉字机内码的概念。汉字机内码是指计算机系统中用于表示汉字的数字编码,一般采用16进制来表示。常见的汉字机内码有GB2312、GBK、GB18030等编码方式。 在Logisim中,我们可以通过建立逻辑电路来模拟汉字机内码的获取过程。首先,我们需要准备一个用于输入汉字的界面,可以使用按钮或者选择框来模拟输入。然后,我们需要编写一段程序,将输入的汉字化为对应的内码。 具体操作如下:首先,在Logisim中创建一个新的电路文件,然后使用组件库中的按钮或者选择框,建立一个汉字输入接口。接着,我们需要添加运算和逻辑电路组件,例如加法器、与门、或门等,以实现内码的计算和换。最后,将输入接口与处理逻辑电路连接起来,以完成整个汉字机内码获取的过程。 完成电路的搭建后,我们可以在Logisim中进行模拟实验。通过点击或选择汉字输入接口,将想要获取内码的汉字输入进去。然后,我们可以观察输出接口上的显示,获取汉字的对应内码。 通过这个实验,我们可以更加直观地理解汉字机内码的获取过程,并且通过修改电路和程序,实现不同编码方式的汉字内码获取。这样的实验可以帮助我们更好地理解计算机系统中汉字的处理与编码原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值