先明确下汉字在机内的表示
1.机内码出现的原因:
机内码的出现是为了解决ASCII码和国标码同时使用时产生二义性的问题;
2.机内码的表示:
国标码的机内码为二字节长的代码,它是在相应国标码的每个字节最高位上加“1”,即汉字机内码=汉字国标码+8080H,其高字节由该汉字的区码+A0H,低字节由该汉字的位码+A0H。
3.汉字16*16点阵:
代码如下:
#include <graphics.h>
#include <stdio.h>
int getbit(unsigned char c,int n)
{return ((c>>n)&1);
}
void puthz16(int qm,int wm)
{
long recordnum;
int i1,i2,i3;
int py=1,x=200,y=200;
char by[32];//字符型占一个字节
FILE *fp;
fp=fopen("C:\\计算机图形学\\hzk16","rb");//hzk16为汉字字库文件
recordnum=(qm-py)*94+wm-1; //16*16点阵汉字字模的32个字节称为一个记录。由汉字的区位码可求得该字在字库中的记录号。
recordnum=recordnum*32;//记录号*32,即得到该字在16*16字库中字模的第一字节的位置
fseek(fp,(long)recordnum,0);
fread(by,32,1,fp);
for(i1=0;i1<16;i1++)//i1代表点阵第几行
for(i2=0;i2<2;i2++)//i2代表第几个字节
for(i3=0;i3<8;i3++)//i3代表
if(getbit(by[i1*2+i2],7-i3))//判断若为1,则进行putpixel画点
putpixel(x+i2*8+i3,y+i1,WHITE);
}
//还可以将汉字放大两倍(根据需要)显示,即一个像素点变成四个像素点
/* {
putpixel(x+i2*16+2*i3,y+2*i1,WHITE);
putpixel(x+i2*16+2*i3+1,y+2*i1,WHITE);
putpixel(x+i2*16+2*i3+1,y+2*i1+1,WHITE);
putpixel(x+i2*16+2*i3,y+2*i1+1,WHITE);}*/
int main()
{initgraph(500,500);
puthz16(16,1);//根据汉字区位码传参
getch();
closegraph();
return 0;
}
汉字区位表可直接查询到
字库文件下载