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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

  汉字的编码是很多初学者不容易搞不明白的事情。最早的汉字字符集是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 stdint 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 区======
          
         

猜你喜欢

转载自blog.csdn.net/hgdfguj/article/details/83821267