中文因爲數量太多,所以與英文用ASCII碼一個字節表示不同,它使用兩個字節來表示。通過計算這兩個字節,我們可以得到其表示的漢字在中文字庫中的位置。讀取該位置的若干字節,以獲得表示這個漢字的點陣信息。有了這些信息,就可以分別在DOS或WINDOWS中顯示該漢字。事實上,在文本文件中保存的就是每個漢字對應的兩個字節編碼,而顯示問題由中文操作系統自動解決。
漢字編碼並不統一,我們使用的是GB碼,而臺灣地區使用的是BIG5碼。BIG5碼文件中保存的是漢字相應的BIG5編碼,GB碼文件中保存的是漢字相應的GB編碼(這也就是“亂碼現象”的來由)。所以轉換工作的關鍵是有一個記錄每個BIG5編碼對應GB編碼的碼錶文件。 第一步 製作碼錶文件
BIG5碼編碼規則是這樣的:每個漢字由兩個字節構成,第一個字節的範圍從0X81-0XFE,共126種。第二個字節的範圍分別爲0X40-0X7E,0XA1-0XFE,共157種。也就是說,利用這兩個字節共可定義出 126 * 157=19782種漢字。這些漢字的一部分是我們常用到的,如一、丁,這些字我們稱爲常用字,其BIG5碼的範圍爲0XA440-0XC671,共5401個。較不常用的字,如濫、調,我們稱爲次常用字,範圍爲 0XC940-0XF9FE,共7652個,剩下的便是一些特殊字符。
製作碼錶文件的原理是這樣的:首先將所有的BIG5編碼寫入一個文件,然後,使用具有BIG5碼到GB碼轉換功能的軟件,如地球村、東方快車、四通利方,將文件轉換爲GB碼文件,即得到碼錶文件。
下面的源程序將所有可能的BIG5編碼(0XA100-0XFEFF)寫入文件“Table.TXT”。
//TURBO C++ 3.0 #include #include void main(){ FILE * codefile; int i,j,k; codefile=fopen("table.txt","w+b"); for (i=0xa1;i<=0xfe;I++){ for(j=0x00;j<=0xff;j++){ fwrite(& i,1,1,codefile); fwrite(& j,1,1,codefile);} } fclose(codefile); return; } 運行地球村、東方快車或四通利方,將“Table.txt”從BIG5碼轉換爲GB碼,即獲得碼錶文件。
第二步 轉換 下面的源程序,將BIG5碼文件轉換爲GB碼文件。 //TURBO C++3.0 #include #include void main(){ int que, wei; FILE * sourcefile; FILE * tabfile; FILE * destfile; sourcefile = fopen("big.txt'''', "r+b"); //BIG5 碼文件 tabfile = fopen("table.txt", ''''r+b"); //碼錶文件 destfile = fopen("gb.txt","w+b"); //轉換生成的GB碼文件 while (!feof(sourcefile)){ fread(& que,1,1,sourcefile); if (feof(sourcefile)){ break; } if (que> =0xa1 && que <=0xfe) //叛斷是否漢字(BIG5編碼) {fread(& wei,1,1,sourcefile); if (wei<0xa1) wei = wei - 0x40; if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 ) + wei), SEEK_SET); fread(& que,1,1,tabfile); fread(& wei,1,1,tabfile); fwrite(& que,1,1,destfile); fwrite(& wei,1,1,destfile); } else fwrite(& que,1,1,destfile); //處理英文 } fclose(sourcefile); fclose(tabfile); fclose(destfile); return; } 以上程序在Win95/97,TC3.0 通過。稍加修改,也可用於VC或VB程序中。用同樣的方法,我們也可以將GB碼轉換爲BIG5碼。
|