漢字編碼基礎:
一、漢字在計算機中的編碼形式
我們都知道,在計算機中英文本元是用乙個位元組的ascii碼表示,該位元組最高位一般用做奇偶校驗,故實際是用7位碼來代表128個字元的,但是對於眾多的漢字,只有用兩個位元組才能表示,這樣用兩個位元組來表示乙個漢字的體制,國家制定了統一的標準,稱為國標碼。國標碼規定,組成兩個漢字**的各位元組最高位為0,這和英文本元表示方法相同,這就有可能把漢字的國標碼看作兩個ascii碼,為此又規定在計算機裡表示漢字時,把最高位置1,表示該碼是漢字,這種最高位為1的**稱為機器內的漢字**,簡稱內碼。計算機裡漢字就是用程式碼頁示的。
例如:「大」這個漢字,
國標碼 3473 00110100 01110011
內碼 b4f3 10110100 11110011
知道漢字在計算機裡是用程式碼頁示的以後,還需要知道具體漢字的結構。我國在2023年公布了《通訊用漢字字符集及其交換碼標準》gb2312-80方案,裡面規定了高頻字、常用字、次常用字集合成漢字基本字符集(共6763個),再加上一些西文字母,希臘字母、日文字元、圖形符號等一共700個。國家標準的漢字字符集在漢字作業系統中是以漢字型檔的形式提供的。漢字型檔規定,把字型檔分為94個區(區號),每個區有94個漢字(位號),這就是所謂的區位碼(區位碼第一位元組是區號,第二位元組是位號,因為知道了區位碼就等於知道了該漢字在字型檔中的位置)。每個漢字在字型檔中是以點陣字模形式儲存的,如一般採用16*16點陣形式,這樣就需要32位元組。在16*16點陣裡,存1的點在顯示時為乙個亮點,存0的點不顯示,這樣漢字就顯示出來了。簡單寫一下「大」這個字的字模:
0000001100000000
0000001100000000
0000001100000000
0000001100000010
1111111111111110
0000001100000000
0000001100000000
0000001100000000
0000001100000000
0000001110000000
0000011001000000
0000110000100000
0001100000010000
0001000000011000
0010000000001110
1100000000000100
這樣當需要顯示「大」這個漢字時,首先把這個字模取出,然後逐位顯示,1顯示0不顯示,螢幕上就會出現「大」這個漢字。
那麼我們怎麼知道漢字的區位碼呢?前面說了,漢字在計算機裡是用內碼儲存的。內碼和區位碼的轉換關係是(還以「大」為例):
區號:b4-a0 位號:f3-a0
也就是說,把內碼減去a0就是區位碼,那麼「大」這個漢字的區位碼就出來了,是在14h區53h號,也就是第20區第83號。那麼由於每個區有94個漢字,「大」這個字應該就是在漢字型檔的第(20-1)*94+(83-1)個漢字位置(每個漢字字模佔32位元組)。那麼現在又要問了,內碼又是怎樣得到的呢?看下面的程式:
main()
執行程式發現,輸出就是b4,f3。
二、西文方式下顯示中文
顯示漢字思路:
(1) 獲得漢字內碼
(2) 換算成區位碼
(3) 在字型檔中取出該漢字的字模(共32位元組)
(4) 1顯示0不顯示
說到這兒,又有一點要說明,由於漢字是16*16點陣結構,說明在一般的西文方式下還不行,因為一般的西文方式,螢幕顯示都是80*25的文字格式,要想顯示中文,必須切換到圖形模式,在圖形模式下才有象素的概念。
下面是乙個實際的例子,大家可以複製到tc裡執行一下就知道了。
#include stdlib.h
#include stdio.h
#include string.h
#include graphics.h
void writehzstr();
void writehz(unsigned char,unsigned char,int,int);
void gethzbit(unsigned char,unsigned char);
char *s=中華人民共和國;
file *fp;
long int fpos; /*具體漢字在字型檔中的偏移量*/
char bitdata[32]; /*儲存漢字字模*/
main()
writehzstr();
fclose(fp);
closegraph();
getch();
}void writehzstr()}}
void writehz(unsigned char left,unsigned char right,int x,int y)
;int i,j;
gethzbit(left,right);
for(i=0;i<16;i++)
for(j=0;j<8;j++) /*和bit與操作以後,在螢幕上畫點*/
}void gethzbit(unsigned char left,unsigned char right)
說明一點,上面用到的漢字型檔檔案hzk16在ucdos裡可以找到,大小是262k。
三、中文模式下顯示中文
這個問題比較簡單,就是先進入ucdos等類似的中文平台,然後一切和普通的字串顯示類似。看下面的程式:
main()
執行此程式前先進入ucdos等中文平台,所以由於各計算機不一定都裝有ucdos,使得程式移植性不強,所以一般都不這樣使用,而採用前面說的西文模式下顯示中文。
註明:這裡只是16*16的漢字,如果想使用24*24的,或者正楷,黑體、隸書等漢字字型,就需要使用不同的漢字型檔,例如hzk24k(正楷),hzk24h(黑體)等等。
初學者學Java 三
任何程式語言只要有三種流程控制結構就可以描述任何問題了,這三種流程控制結構分別是 順序結構,選擇結構和迴圈結構。順序結構就是按照邏輯結構的順序一句句往下寫,這裡就不做過多的介紹了。主要說說選擇結構和迴圈結構。1.選擇結構的第一種形式 if 布林表示式 如果執行語句只有一條,可以省略,但最好寫上,增加...
Java初學者學習筆記(三)
基本if選擇結構 可以處理單分支的if選擇結構 if else選擇結構 可以處理兩個分支的if選擇結構 多重if選擇結構 可以處理多個分支的if選擇結構 巢狀if選擇結構 可以處理某分支中巢狀if結構的 if選擇結構 if選擇結構是根據條件判斷之後再做處理 基本if選擇結構 if 條件 if els...
初學java小結1
1.scanner類的應用 1 使用scanner類時,要建立乙個物件 scanner input new scanner system.in 這裡指的是控制台輸入流。需要注意的是,scanner在不使用時要關閉,即 input.close ps 當 中需要多次使用scannner建立輸入流時,不要...