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

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

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

汉字字库知识,首先了解以前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

分享给朋友:

相关文章

一个易语言写的函数信号发生器。

一个易语言写的函数信号发生器。

易语言写的函数信号发生器,编写的想法是准备应用“雷达”的信号发射源。本来包含声音部分,有待继续完善。下载地址:https://pan.baidu.com/s/1mi22Ico...

发布一个雷达显示程序,仅测试,有问题请交流。

发布一个雷达显示程序,仅测试,有问题请交流。

下载地址:雷达显示程序.rar这个雷达显示程序用来显示雷达数据的。使用易语言编写。数据部分还没完善。欢迎提意见。...

随手写的时间设置程序,主要是防止系统时间无故修改。

随手写的时间设置程序,主要是防止系统时间无故修改。

程序说明:测试版程序功能。同步系统时间数据可选月历,手工输入可自动识别时间修改,修改后一分钟报警。测试版没有恢复时间功能。以后会增加。欢迎下载的朋友帮助我找程序问题,没有花多少功夫,请多多原谅。这个程...

几种在linux中的调试器的编译结果。

几种在linux中的调试器的编译结果。

很多人用源码进行编译,会不成功,原因有很多,我现在讲讲linux 下必有的gdb调试器来说明一下。我用的linux 系统 是 优麒麟 19.04.10.1 加强版,属于试用版。随系统自带的gdb是8....

linux 下的 opengl SDK。

linux 下的 opengl SDK。

opengl 图形库是开放式图形库,最近出了一个freeglut3 我们下载它:sudo apt-get install freeglut3sudo apt-get install freeglut3...

关于DOSBOX的简单说明。

关于DOSBOX的简单说明。

linux 下的共享软件DOSBOX 在有些版本的linux 中不能使用鼠标。网上说明要换声卡地址和中断,连接鼠标端口才可以使用。 曾经设置过,可以使用参数不记得。有个解决方法。这是软件问题。 先卸载...