在Turbo C集成開發(fā)環(huán)境中不是漢化的,如何編制能顯示漢字的C程序呢?
這種方法是調(diào)用中文漢字庫進(jìn)行漢字顯示。國家標(biāo)準(zhǔn)規(guī)定:漢字庫分94個區(qū),每個區(qū)有94個漢字(以位作區(qū)別),每個漢字在漢字庫中有確定的區(qū)和位編號,
這就是漢字的區(qū)位碼。每個漢字在庫中是以點陣字模形式存儲的,一般采用16×16點陣(32字節(jié))、24×24點陣(72字節(jié)),每個點用一個二進(jìn)制位
(0或1)表示,對應(yīng)在屏幕上顯示出來,就是相應(yīng)的漢字。
由于在中文環(huán)境下,輸入的是漢字的內(nèi)碼,我們必須將之轉(zhuǎn)換成區(qū)位碼,算出偏移量,從字庫中找到對應(yīng)的漢字,將其字模顯示即可。
內(nèi)碼轉(zhuǎn)換成區(qū)位碼方法如下:
qh=c1-0xa0;
wh=c2-0xa0;
其區(qū)位碼就是:
qw=qh*0xff+wh
該漢字在字庫中離起點的位置是:
offset=(94*(qh-1)+(wh-1))*32L
得到了數(shù)據(jù)之后再對每個字節(jié)的每個位進(jìn)行判斷,如果為1就用putpixel()在相應(yīng)的點上畫一點,如果為0就不進(jìn)行畫點操作。
以下的代碼部分為原創(chuàng): |
void hanzi16(int x,int y,char *s,int color,int row,int col)
{
FILE *fp;
char buf[16][2];
int i,j,k,m,n;
unsigned char qh,wh;
unsigned long offset;
if( (fp=fopen("hzk16","rb"))==NULL )
{
closegraph();
printf("Can‘t open hzk16");
getch();
exit(0);
}
while(*s) ;遍歷所有需要顯示的漢字
{
qh=(*s)-0xa0; ;內(nèi)碼轉(zhuǎn)區(qū)碼
wh=*(s+1)-0xa0; ;內(nèi)碼轉(zhuǎn)位碼
offset=(94*(qh-1)+(wh-1))*32L; ;計算該漢字在字庫中的偏移量
fseek(fp,offset,SEEK_SET); ;在文件中定位
fread(buf,32,1,fp); ;取出32字節(jié)的點陣字模存入BUF中
for(i=0;i<16;i++) ;由于16X16點陣中有16行
for(n=0;n<row;n++) ;行增大倍數(shù)
for(j=0;j<2;j++) ;每行有2個字節(jié)
for(k=0;k<8;k++) ;測試字節(jié)的位
for(m=0;m<col;m++) ;列增大倍數(shù)
if( buf[i][j] & (0x80>>k) ) ;做“與”位操作,如果是1,就畫點
putpixel(x+j*8*col+k*col+m,y+i*row+n,color);
s+=2; ;一個漢字占2個字節(jié)
x+=(16*col); ;下一列的輸出位置
}
fclose(fp);
}