DOS下的点阵汉字.doc_第1页
DOS下的点阵汉字.doc_第2页
DOS下的点阵汉字.doc_第3页
DOS下的点阵汉字.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

vb实现汉字点阵字模的提取 程序匠人 发表于 2008-2-15 9:50:00 阅读全文(806) | 回复(0) | 引用通告(0) | 编辑 对于HZK16字库里的1616汉字(其实只用到了1615,即16行15列,最后1列是空白的,但是作为GBK汉字,则使用了最后这一列)来说一共需要256个点来显示一个普通的汉字,那么共需要32个字节才能达到该目的。首先,一个GB2312汉字是由两个字节编码的,范围为A1A1FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(当然,这只是编码的许可范围,而不是这些编码都对应有字型,比如符号区就有很多编码空白区域)。所以,当接受到了一个汉字编码譬如“鹿”字,如何在HZK16文件中找到它对应的32个字节的字模数据呢。计算方法如下:C2H-A1H=21H (33D区,因为汉字编码是从A1区开始的,所以文件最前面就是从A1区开始)B9H-A1H=18H (24D位,道理如上所述,这就是所谓的区位码)21H5EH+18H=C36H (5EH就是94D,代表一个区有94个字符,C36H就是说这个字符在HZK16里是第C36H个)C36H20H=186C0H (20H就是32D,代表一个字符占32个字节,这里得到的186C0H就是“鹿”字在HZK16文件中的偏移地址,从这里开始之后的32个字节就是我们要寻找的字符字模)Dim zw(1 To 128) As BytePrivate Sub Command1_Click()If Len(Text1.Text) 4 ThenMsgBox 输入汉字不足四个!Text1.Text = ElseDim ff As Stringff = CALL_LED(Text1.Text)For I = 1 To 128 Step 1If (Imod8) = 0 ThenText2.Text = Text2.Text & 0End IfText2.Text = Text2.Text & Hex(zw(I) & HNext IEnd IfEnd SubPrivate Function CALL_LED(ledstring As String)For j = 1 To 4AA = Hex(Asc(Mid(ledstring, j, 1)bb = (94 * (CLng(&H & Mid(AA, 1, 2) - &HA1) + (CLng(&H & Mid(AA, 3, 2) - &HA1) * 32For I = 1 To 32 Step 1Open C:Documents and SettingsAdministrator桌面点阵HZK16 For Binary As #1Get #1, bb + I, zw(32 * (j - 1) + I)Close #1Next INext jEnd FunctionPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()Text1.Text = Text2.Text = End SubDOS下的点阵汉字你是否碰到过用启动盘启动系统后用DIR命令得到一串串莫名其妙的字符?有经验的朋友会告诉你:那是汉字。汉字?你不禁会问:怎么一个我一个也不认识。但那确确实实是汉字,如果你启动UCDOS或其他的汉字系统后,就会看到那是一个个熟悉的汉字。同样是汉字,为什么前后会看到不同的结果?呵呵,其实在电脑硬件中,根本没有汉字这个概念,也没有英文的概念,这铁玩意认识的概念只有内码。汉字的内码点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。不信,你可以用记事本写一C文件:main() unsigned char *s,*e=ABcd,*c=你好; clrscr(); printf(English char =); s=e; while(*s!=0) /*C的字符串以0为结束符*/ printf(%3d,*s); s+; printf(nChinease char=); s=c; while(*s!=0) printf(%3d,*s); s+; getch();再用TC输入*.txt打开运行,看见了没有,那些数值即英文和汉字的各字节内码。汉字字模得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的A在字模中是这样记载的:而中文的“你”在字模中却是这样记载的:在硬件系统内,英文的字模信息一般固化在ROM里,即使在没有进入系统的CMOS里,也可以让你看到英文字符。而在DOS下,中文的字模信息一般记录在汉字库文件HZK16里。汉字库文件了解字母和汉字是按字模位信息显示的原理后,那如何得到汉字的字模信息呢?难道要我们自己去做?NO。DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1)*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。汉字库文件了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。以使用VGAHI模式显示“我”字为例,程序如下:#include graphics.h#include stdio.hmain() int i=VGA,j=VGAHI,k; unsigned char mat162,chinease3=我; FILE *HZK; if(HZK=fopen(hzk16,rb)=NULL) exit(0); initgraph(&i,&j,); i=chinease0-0xa0;j=chinease1-0xa0;/*获得区码与位码*/ fseek(HZK,(94*(i-1)+(j-1)*32l,SEEK_SET); fread(mat,32,1,HZK); for(j=0;j16;j+) for(i=0;i2;i+) for(k=0;kk)/*测试为1的位则显示*/ putpixel(i*8+k,j,WHITE); getch(); closegraph(); fclose(HZK);怎么样?只要掌握了正确的方法,显示汉字并不复杂。打印字库文件和HZK12如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到.呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat243则应该这样输出: for(i=0;i24;i+) for(j=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论