在Turbo C集成開(kāi)發(fā)環(huán)境中不是漢化的,如何編制能顯示漢字的C程序呢?
這種方法是調用中文漢字庫進(jìn)行漢字顯示。國家標準規定:漢字庫分94個(gè)區,每個(gè)區有94個(gè)漢字(以位作區別),每個(gè)漢字在漢字庫中有確定的區和位編號,
這就是漢字的區位碼。每個(gè)漢字在庫中是以點(diǎn)陣字模形式存儲的,一般采用16×16點(diǎn)陣(32字節)、24×24點(diǎn)陣(72字節),每個(gè)點(diǎn)用一個(gè)二進(jìn)制位
(0或1)表示,對應在屏幕上顯示出來(lái),就是相應的漢字。
由于在中文環(huán)境下,輸入的是漢字的內碼,我們必須將之轉換成區位碼,算出偏移量,從字庫中找到對應的漢字,將其字模顯示即可。
內碼轉換成區位碼方法如下:
qh=c1-0xa0;
wh=c2-0xa0;
其區位碼就是:
qw=qh*0xff+wh
該漢字在字庫中離起點(diǎn)的位置是:
offset=(94*(qh-1)+(wh-1))*32L
得到了數據之后再對每個(gè)字節的每個(gè)位進(jìn)行判斷,如果為1就用putpixel()在相應的點(diǎn)上畫(huà)一點(diǎn),如果為0就不進(jìn)行畫(huà)點(diǎ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; ;內碼轉區碼
wh=*(s+1)-0xa0; ;內碼轉位碼
offset=(94*(qh-1)+(wh-1))*32L; ;計算該漢字在字庫中的偏移量
fseek(fp,offset,SEEK_SET); ;在文件中定位
fread(buf,32,1,fp); ;取出32字節的點(diǎn)陣字模存入BUF中
for(i=0;i<16;i++) ;由于16X16點(diǎn)陣中有16行
for(n=0;n<row;n++) ;行增大倍數
for(j=0;j<2;j++) ;每行有2個(gè)字節
for(k=0;k<8;k++) ;測試字節的位
for(m=0;m<col;m++) ;列增大倍數
if( buf[i][j] & (0x80>>k) ) ;做“與”位操作,如果是1,就畫(huà)點(diǎn)
putpixel(x+j*8*col+k*col+m,y+i*row+n,color);
s+=2; ;一個(gè)漢字占2個(gè)字節
x+=(16*col); ;下一列的輸出位置
}
fclose(fp);
}
聯(lián)系客服