1. 程式人生 > >用C 程式理解漢字的機內碼錶示

用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 區======