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

汉字的编码是非常多刚開始学习的人不easy搞不明确的事情。最早的汉字字符集是GB2312-80,收入汉字6763个,符号715个,总计7478个字符,大陆普遍使用的简体字字符集。本文借助于一个能输出这些字符的简单的C++程序,体验汉字字符的编码。

先简单介绍一下GB2312-80的概况。

1、区位码

每一个汉字及符号都有一个区位码,即每一个汉字有一个区号(两位十进制)和一个位号(两位十进制)。一共分了94个区,每一个区中有94个汉字。

例如以下图了当中第1区和17区中的汉字:

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

2、国标码

汉字的国标码能够在区位码基础上换算得到:国标码=(区位码的十六进制表示)+2020H,国标码的取值范围:2121H~7E7EH。

比如:“啊”的区码是16,位码为01,其区位码的十六进制表示为1001H,得到“啊”的国标码为:3021H。例如以下图:

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

3、机内码

中文或西文信息在计算机系统中的代码表示称为机内码。ASCII码是一种西文机内码,用一个字节表示,其最高位均为0。汉字机内码用连续两个字节表示,为能和ACSII符号区分,每一个字节的最高位是1。机内码和国标码的转换规则是:机内码 = 国标码+8080H =(区位码的十六进制表示)+A0A0H。显然,就是将国标码的两个字节的最高位均置为1就可以。

比如,“啊”的国标码为:3021H,加上8080H后,其机内码为B0A1H,例如以下图所看到的:

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

以下的程序,将GB2312-80中全部的汉字输出到一个文件里,对比上面的原理,读程序并执行,你将理解汉字在机器内部的表示。

#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;
}

程序输出的全部汉字,见本文后附件。


有了如上的知识,试执行以下的程序,看其结果是什么,而且试着做出解释。这是在处理汉字中常见的问题。

#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 区======























原文链接: https://www.cnblogs.com/hrhguanli/p/3805799.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/135442

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月11日 上午3:04
下一篇 2023年2月11日 上午3:10

相关推荐