當前位置:編程學習大全網 - 編程語言 - C語言編程求救,編程高手請進!

C語言編程求救,編程高手請進!

妳是否碰到過用啟動盤啟動系統後用DIR命令得到壹串串莫名其妙的字符?有經驗的朋友會告訴妳:那是漢字。漢字?妳不禁會問:怎麽壹個我壹個也不認識。但那確確實實是漢字,如果妳啟動UCDOS或其他的漢字系統後,就會看到那是壹個個熟悉的漢字。同樣是漢字,為什麽前後會看到不同的結果?呵呵,其實在電腦硬件中,根本沒有漢字這個概念,也沒有英文的概念,這鐵玩意認識的概念只有——內碼。

漢字的內碼

點頭表示什麽?是“對”、“YES”,偏偏有的地方表示的意義卻恰恰相反。壹個動作,有不同的詮釋;壹個問題,有不同的答案;而壹個符號,卻有不同的意義,關鍵在於:妳是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對於顯示英文操作,由於英文字母種類很少,只需要8位(壹字節)即可。而對於中文,常用卻有5000以上,於是我們的DOS前輩想了壹個辦法,就是將ASCII表的高128個很少用到的數值以兩個為壹組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。不信,妳可以用記事本寫壹C文件:

main()

{

unsigned char *s,*e="ABcd",*c="妳好";

clrscr();

printf("English char =");

s=e;

while(*s!=0) /*C的字符串以0為結束符*/

{

printf("%3d,",*s);

s++;

}

printf("\nChinease char=");

s=c;

while(*s!=0)

{

printf("%3d,",*s);

s++;

}

getch();

}

再用TC輸入*.txt打開運行,看見了沒有,那些數值即英文和漢字的各字節內碼。

漢字字模

得到了漢字的內碼後,還僅是壹組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是壹組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀,如英文的'A'在字模中是這樣記載的:

而中文的“妳”在字模中卻是這樣記載的:

在硬件系統內,英文的字模信息壹般固化在ROM裏,即使在沒有進入系統的CMOS裏,也可以讓妳看到英文字符。而在DOS下,中文的字模信息壹般記錄在漢字庫文件HZK16裏。

漢字庫文件

了解字母和漢字是按字模位信息顯示的原理後,那如何得到漢字的字模信息呢?難道要我們自己去做?NO。DOS前輩們經過艱辛的努力,將制作好的字模放到了壹個個標準的庫中以免去後輩的麻煩,這就是點陣字庫文件。壹般我們使用16*16的點陣宋體字庫,所謂16*16,是每壹個漢字在縱、橫各16點的區域內顯示的。不過後來又有了HZK12、HZK24,HZK32和HZK48字庫及黑體、楷體和隸書字庫。雖然漢字庫種類繁多,但都是按照區位的順序排列的。前壹個字節為該漢字的區號,後壹個字節為該字的位號。每壹個區記錄94個漢字,位號則為該字在該區中的位置。因此,漢字在漢字庫中的具體位置計算公式為:94*(區號-1)+位號-1。減1是因為數組是以0為開始而區號位號是以1為開始的。這僅為以漢字為單位該漢字在漢字庫中的位置,那麽,如何得到以字節為單位得到該漢字在漢字庫中的位置呢?只需乘上壹個漢字字模占用的字節數即可,即:(94*(區號-1)+位號-1)*壹個漢字字模占用字節數,而按每種漢字庫的漢字大小不同又會得到不同的結果。以16*16點陣字庫為例,計算公式則為:(94*(區號-1)+(位號-1))*32。漢字庫文該從該位置起的32字節信息即記錄了該字的字模信息。

漢字庫文件

了解點陣漢字及漢字庫的構成原理後,顯示漢字就變得簡單。以16*16點陣字庫為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字庫文件讀入壹2*16數組再用for循環壹位位地顯示。以使用VGAHI模式顯示“我”字為例,程序如下:

#include "graphics.h"

#include "stdio.h"

main()

{

int i=VGA,j=VGAHI,k;

unsigned char mat[16][2],chinease[3]="我";

FILE *HZK;

if((HZK=fopen("hzk16","rb"))==NULL)

exit(0);

initgraph(&i,&j,"");

i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區碼與位碼*/

fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);

fread(mat,32,1,HZK);

for(j=0;j<16;j++)

for(i=0;i<2;i++)

for(k=0;k<8;k++)

if(mat[j][i]&(0x80>>k)) /*測試為1的位則顯示*/

putpixel(i*8+k,j,WHITE);

getch();

closegraph();

fclose(HZK);

}

怎麽樣?只要掌握了正確的方法,顯示漢字並不復雜。

打印字庫文件和HZK12

如果妳有UCDOS的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),妳還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點陣字庫,每字模占用3*24字節。如果妳按照HZK16的顯示方法的話,妳會看到......呵呵,字被放倒了。這是因為該類字庫與壹般的漢字庫不同,這類大字模漢字庫是專供打印的打印字庫,為了打印的方便將字模都放倒了,妳使用時,只要將字模的位信息縱橫轉置顯示即可。例如妳如果定義為mat[24][3]則應該這樣輸出:

for(i=0;i<24;i++)

for(j=0;j<24;j++)

if((0x80>>i%8)&mat[j][i/8]) /*轉置顯示*/

putpixel(j+x,y+i,color);

還有壹類字庫HZK12,雖然屬於標準字庫類型,但如果妳將它的字模當作12*12位計算的話,根本無法正常顯示漢字。因為字庫設計者為了使用的方便,字摸每行的位數均補齊為8的整數倍,於是實際該字庫的位長度是16*12,雖然每行都多出了4位,但這4位都是0(不顯示),並不影響顯示效果。

  • 上一篇:微信小程序是怎麽回事,加入後怎麽賺錢的
  • 下一篇:自動編程軟件的優點有哪些
  • copyright 2024編程學習大全網