📄 hzk12.cpp
字号:
fprintf(fp2,";");
fseek(fp1,-ll0,1);
for(int k=0;k<t;k++)
fputc(fgetc(fp1),fp2); //把最后一行汉字注释出来
break;
}
}while(1);
fprintf(fp2,"%c%c",0x0d,0x0a);
if(!(i%16))
{
fprintf(fp2,"//共%d行,每行8个汉字 ",j);
fprintf(fp2,"总计(%d*%d)=%d个汉字 测试累加值为 %d",j,8,(j*8),i/2);
}
else
{
fprintf(fp2,"//共%d行,最后一行除外每行8个汉字,最后一行%d个汉字 ",j,(i%16)/2);
fprintf(fp2,"总计(%d*%d)+%d=%d个汉字 测试累加值为 %d",j-1,8,(i%16)/2,((j-1)*8)+(i%16)/2,i/2);
}
fprintf(fp2,"%c%c",0x0d,0x0a);
}
fprintf(fp2,"%c%c",0x0d,0x0a);
//-------------------------------------------------------
//写入汉字内码表对应的点阵表
m=0;//最大限制值
fseek(fp1,0,0); //文件指针指向开头第1字节
un.st.b=fgetc(fp1); //取汉字的第一个字节
un.st.a=fgetc(fp1); //取汉字的第二个字节
if(ch=='c'||ch=='C') //C51格式的点阵数据
{
fprintf(fp2,"//汉字内码表对应点阵,每行1个汉字24字节:");
fprintf(fp2,"%c%c",0x0d,0x0a);
fprintf(fp2,"uchar code hzdz [ ][%d] = {",HZDZ_LEN);
fprintf(fp2,"%c%c",0x0d,0x0a);
while(1)
{
if(feof(fp1))
{
cout<<"\nThe FILE1.TXT have finished!\n";
break; //点阵提取结束
}
un0.ll=gethzdz(un.ab); //取该汉字的24字节点阵数据
m++;
if(un0.ll==0xb020) //读HZK12文件到结尾,返回一个数作为标志
break; //'啊'的内码-0xA1A1=0xB040
//------------------------------------------------
//hanzi_view(); //查看24字节汉字点阵的外形是不是刚才读取的汉字
//------------------------------------------------
//将这个汉字的点阵数据写入目标文件
fgetc(fp1); //注意fp加1了,后面需要fseek(fp1,-1L,1);
for(int i=0;i<(HZDZ_LEN-1);i++)
{
fprintf(fp2,"0x%.2x%c",hzdz[i],',');
//if(i==12)
// fprintf(fp2,"%c%c",0x0d,0x0a);
}
if(feof(fp1)) //这个判断必需上一句fgetc(fp1);
{
fprintf(fp2,"0x%.2x}",hzdz[i]); //结束时数据尾不需要有逗号了
}
else
fprintf(fp2,"0x%.2x%c",hzdz[i],',');
fprintf(fp2,"%c%c",0x0d,0x0a);
///-------------------------------------------
//view 观察
printf("\ntotal m = %d\n",m);
/*
printf("\nposition = %x",un0.st0.d);
printf("%x",un0.st0.c);
printf("%x",un0.st0.b);
printf("%0.2xH BYTE\n = 32*((FIRST-0xA1)*94+(SECOND-0xA1))\n",un0.st0.a);
cout<<"\ncontinue(y/n)?\n";
*/
//ch=getch();
//if(ch=='n'||ch=='N')
// break;
//--------------------------------------------------------------------------
if(m>=7000) //限制最多提取7000个汉字,比国标还多,够了吧?国标只有6000多个
{
fprintf(fp2,"不会吧,你的汉字库比国标还大?\n");
break; //如果汉字库没有错,根本不会从这里退出
}
fseek(fp1,-1L,1); //这里要减去1,因为前面有fgetc(fp1);
un.st.b=fgetc(fp1); //取汉字内码第1字节
un.st.a=fgetc(fp1); //取汉字内码第2字节
}
}
else //汇编格式的点阵数据
{
fprintf(fp2,";汉字内码表对应点阵,每行1个汉字(24字节)");
fprintf(fp2,"%c%c",0x0d,0x0a);
fprintf(fp2,"hzdz_addr:");
fprintf(fp2,"%c%c",0x0d,0x0a);
while(1)
{
if(feof(fp1)) //检测FILE1.TXT文件是否结束
{
cout<<"\nThe FILE1.TXT have finished!\n";
break; //点阵提取结束
}
un0.ll=gethzdz(un.ab); //取该汉字的24字节点阵数据
m++;
if(un0.ll==0xb020) //读HZK12文件到结尾,返回一个数作为标志
break; //'啊'的内码-0xA1A1=0xB040
//------------------------------------------------
//hanzi_view(); //查看24字节汉字点阵的外形对照读取的汉字
//------------------------------------------------
//将这个汉字的点阵数据写入文件
for(int i=0;i<HZDZ_LEN;)
{
if(!i)
fputs("DB ",fp2);
fprintf(fp2,"0%.2xH%c",hzdz[i],',');
i++;
fprintf(fp2,"0%.2xH",hzdz[i]);
i++;
if(i<(HZDZ_LEN-1))
fputc(',',fp2);
}
fprintf(fp2,"%c%c",0x0d,0x0a);//回车
///-------------------------------------------
//view 观察
printf("\ntotal m = %d \n",m);
/*
printf("\nposition = %x",un0.st0.d);
printf("%x",un0.st0.c);
printf("%x",un0.st0.b);
printf("%xH BYTE\n = 32*((FIRST-0xA1)*94+(SECOND-0xA1))\n",un0.st0.a);
cout<<"\ncontinue(y/n)?\n";
*/
//ch=getch();
//if(ch=='n'||ch=='N')
// break;
//--------------------------------------------------------------------------
if(m>=7000) //限制最多提取7000个汉字,比国标还多,够了吧?国标只有6000多个
{
fprintf(fp2,"不会吧,你的汉字库比国标还大?\n");
break; //如果汉字库没有错,根本不会从这里退出
}
un.st.b=fgetc(fp1); //取汉字内码第1字节
un.st.a=fgetc(fp1); //取汉字内码第2字节
}
}
fclose(fp1);
fclose(fp2);
cout<<"\nPress any key to exit "<<endl;
getch();
return;
}
/*
函数功能:计算获取汉字内码对应的24字节的点阵数据
计算公式:该汉字在点阵字库HZK12里存放的位置=([汉字的第1字节-0xA1]*94+[汉字的第2字节-0xA1])*24 字节
同样, 该汉字在点阵字库HZK16里存放的位置=([汉字的第1字节-0xA1]*94+[汉字的第2字节-0xA1])*32 字节
明白了吧? 16*16点阵每个汉字需要(16*16)/8=32字节空间,12*12点阵每个汉字需要(12*16)/8=24字节的空间,每
行有4个点是没有用的,即每行第2个字节有4位无点阵数据,实际上每个汉字可以压缩成(12*12)/8=18字节.
*/
unsigned long gethzdz(unsigned int n)
{
FILE *fp;
static unsigned long m=0xb020;
unsigned long j,k; //如何定义可以实现最小的内存占用?
char i;
union word
{
unsigned int ab;
struct bytes
{
unsigned char a;
unsigned char b;
}st;
}un;
//***********************************
//start
if((fp=fopen("HZK12","rb"))==NULL)
{
cout<<"Read HZK12 error !\n";
cout<<"Press any key to exit!";
getch();
return m ;
}
//************************************************
un.ab=n;
un.ab-=0xa1a1;
j=un.st.b;
k=un.st.a;
//************************************************
//view
window(1,2,16,18);//左、上、右、下
/*
printf("\nthe new value un.ab-0xA1A1 = %04.4x ",un.ab);
//getch();
printf("\nunsigned char un.st.b = %02.2x ",un.st.b);
printf(" to unsigned long j = %02.2lx ",j);
printf("\nunsigned char un.st.a = %02.2x ",un.st.a);
printf(" to unsigned long k = %02.2lx \n",k);
*/
//getch();
//************************************************
m=HZDZ_LEN*(j*94+k);
//**************************************************
//view
/*
printf("we get the position = 32*(%0.2x*94+%0.2X)\n",j,k);
printf(" = %0.2lx\n",m);
*/
//getch();
//**************************************************
if(fseek(fp,m,0))
{
fclose (fp);
return 0xb020; //读HZK12文件到结尾
}
for(i=0;i<HZDZ_LEN;i++)
hzdz[i]=fgetc(fp);
fclose(fp);
return (m);
}
//汉字点阵数据显示观察
/*
void hanzi_view()
{
int k;
for(char i=0;i<HZDZ_LEN;)
{
for(char j=0;j<8;j++)
{
k=7-j;
line[j]=(hzdz[i])>>k;
line[j]&=0x01;
}
i++;
for(;j<16;j++)
{
k=15-j;
line[j]=(hzdz[i])>>k;
line[j]&=0x01;
}
i++;
for(j=0;j<(HZDZ_LEN/2);j++)
{
if(line[j])
printf(" o",line[j]);
else
printf(" ");
}
cout<<endl;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -