当前位置:首页 > 我的程序 > 正文内容

放置一点代码,关于汉字的知识,从DOS的汉字点阵字库说起。

Peirre3年前 (2022-11-08)我的程序435

汉字字库知识,首先了解以前DOS下的汉字字库的数据。

常用的汉字字库有12X12,15X15,16X16的点阵字库,还有24点阵,48点阵的字库用于打印机打印。出现在早期的UCDOS,CCDOS,和TW汉字系统上。

16X16点阵的汉字,一个汉字占32个字节。

24X24点阵的汉字,一个汉字占72个字节。

32X32点阵的汉字,一个汉字占128个字节。

点阵汉字的数据,分以行为主,和以列为主的汉字数据。CCDOS是以列为主的,UCDOS是以行为主的汉字数据字库。

汉字字库的读取:汉字字库的内码是区位码。这个计算机专业课有讲过。但是区位码的第7行到第12行之间为空白,或其它点阵信息。

所以DOS的点阵字库中有压缩版的汉字库和非压缩版的汉字库。

很多网上的DOS早期游戏中的中文游戏部分,一般一个游戏中是带有专门的字库的,这些点阵字库都很好看。

区位码是汉字点阵数据信息在原汉字库的序号。

公式:

     m=((code/100)-1)*94+(code%100)-1

这里的code是区位码,m是字库汉字点阵数据中的汉字偏量数据值。

汉字点阵信息的第一个字节在原汉字库的偏移量为

     k=m*kk

kk是汉字点阵信息所占用的字节数。

#include "stdlib.h"
#include "stdio.h"
void hzlibr1 (num,fn1,fn2,fn3)
char *fn1,*fn2,fn3;
int num;
{FILE *fp1,*fp2,*fn3;
 int code,i,j,m,x,y,kk;
 long int k;
 char *p;
 kk=(num+1)*(num+1)*8;
 p=malloc(kk*sizeof(char));
 if((fp1=fopen(fn1,"r+b"))==NULL)
   { printf("cannot open fn1 \n");
     exit (0);
    }
 if ((fp2=fopen(fn2,"w+b"))==NULL)
   { printf("cannot open fn2 ! \n");
     exit (0);
    }
 if ((fp3=fopen(fn3,"r+t"))==NULL)
   { printf ("cannot open fn3 ! \n");
     exit (0);
   }
 i=0;
 while (fscanf(fp3,"%d",&code) != EOF)
   { j=code;
     y=j/100;
     x=j-y*100;
     m=(y-1)*94+(x-1);
     k=(long)m*(long)kk;
     fseek(fp1,k*sizeof(char),SEEK_SET);
     fread(p,sizeof(char),kk,fp1);
     k=(long)i*(long)kk;
     fseek(fp2,k*sizeof(char),SEEK_SET);
     fwrite(p,sizeof(char),kk,fp2);
     i=i+1;
    }
  fclose(fp1);fclose(fp2);fclose(fp3);
  free(p);
  return;
 }

程序函数介绍:

include 关键字是包含文件,包含 标准库文件头,和标准输入输出文件头。

函数带4个入口参数,返回值为NULL。

函数入口前三个参数为指针函数。

FILE 是一个数据结构,包含文件指针。

malloc 是分配内存空间函数。

fopen 是打开文件函数

printf 是显示文本函数

fscanf 是键盘输入函数

fseek 是文件查找指针函数

fread 是读文件数据函数

fwrite 是写文件数据函数

fclose 是关闭文件函数

free 是清空指针所指的内存缓冲区空间。

这些函数包含在标准头文件中,是文件处理模块,和标准输出输出模块。

上面的函数是读字库文件,字库文件是以行为主的方法保存数据的,且6行空白区没被压缩。


现在,让我们进化一下,我出个题目:

如果汉字数据第7行到第12行压缩了该怎么办?

列出公式:

     (code / 100) < 7 时:

         m=((code/100)-1*94+(code%100)-1

       (code /100) >= 7 时:

         m=((code/100)-7)*94+(code%100)-1

汉字点阵信息的第一字节偏移量是:

       k=m*kk

下期再会,to be coniunte......

b1.jpg

分享给朋友:

相关文章

关于编译器不愿意说的那些事。

关于编译器不愿意说的那些事。

计算机发展了好多年。当中也不泛有很多对程序的爱好。很多人不是专业水平,也不是在算法类中特别出众,就是喜欢而已。好像认为自己就只那个水平,或者为一些调试不通过发愁。可以说,实际上都不是你的错,是编译器的...

谈谈引导程序的想法。

谈谈引导程序的想法。

当个人电脑一出现就有了磁盘系统,不管是软盘,光盘,硬盘,计算机要应用操作系统就要引导,引导程序一段代码。这引导代码很小,在第一个磁盘的扇区上,平时没什么人注意它。这段代码损坏一个字节,都会造成计算机瘫...

刚刚上手的一个汇编程序nasm。

刚刚上手的一个汇编程序nasm。

今天使用了masm32软件,总有使不上劲的感觉。因为intel 指令集很多都没有,自己想测试一下,一边翻资料,一边使用。windows 编程好用,但是指令不全,心里总是感觉差一点。又不是编大程序,只是...

雷达新品硬件介绍。

雷达新品硬件介绍。

5.8G雷达模块:这是一个简单的探索物体移动的一个模块,可用于感应移动的物体。电磁波感应和光波补偿感应灵敏度中等,有误判的可能。识别很简单,只判别一个感应高电信号。有挡体就反应电信号。初步识别功能。一...

VC++ 版本升级常见错误一句集。

VC++ 版本升级常见错误一句集。

很多程序源码从低VC版本到高VC版本就发现不能编译,现在说一下常见问题。warning C4838: 从“unsigned int”转换到“INT”需要收缩转换。这是因为 int 整形变量在不同的机器...

Blender 如何建立.mash 和.x文件。(关于Directx 11,OGRE图形库与Blender)

Blender 如何建立.mash 和.x文件。(关于Directx 11,OGRE图形库与Blender)

OGRE图形开发库已经发展很多年了,因为它是免费开源项目,所以使用还很广泛。OGRE图形库应用须要3d图形数据文件,OGRE图形库默认的是.mash 我们有方法制作它。.mash 文件任何3d应用软件...