社区
C语言
帖子详情
用TC显示汉字->字库是如何回事
5852
2003-10-19 02:24:44
听人家说有个点阵字库和矢量字库,不是很明白,不知道有哪位仁兄可以帮忙的,在此先谢了
...全文
192
4
打赏
收藏
用TC显示汉字->字库是如何回事
听人家说有个点阵字库和矢量字库,不是很明白,不知道有哪位仁兄可以帮忙的,在此先谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
5852
2003-10-20
打赏
举报
回复
太感谢daizi了 点阵字库 我终于对点阵字库有了感觉 不过矢量字库我还是不明白
daizh
2003-10-19
打赏
举报
回复
点阵汉字的显示
了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。以使用VGAHI模式显示“我”字为例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{ int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码与位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
怎么样?只要掌握了正确的方法,显示汉字并不复杂。
打印字库文件和HZK12
如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出:
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/
putpixel(j+x,y+i,color);
还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字摸每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。
daizh
2003-10-19
打赏
举报
回复
DOS下的点阵汉字
你是否碰到过用启动盘启动系统后用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打开运行,看见了没有,那些数值即英文和汉字的各字节内码。
********汉字字模*******
得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状.
在硬件系统内,英文的字模信息一般固化在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字节信息即记录了该字的字模信息
mosaic
2003-10-19
打赏
举报
回复
很早以前搞过此类东东,记得是从ucdos里面搞了几个点阵字库(好像有16*16和24*24)的,根据汉字两个字节的大小用一个算法从字库里面可以读出来.去图书馆找找以前的汉字编程的书看看
源代码中的汉子和全角字符的提取程序
在DOS下或者单片机应用中,要
显示
较少的
汉字
和全角字符,为了节省空间,通常是建立小
字库
。而建立小
字库
第一步就是提取程序中需要
显示
的
汉字
。由于是在源程序中检索,必须考虑绕过程序中用于注释的
汉字
。提取C语言中的全角字符简单流程如下:开始读取->是注释符->绕过注释->否则读取字符
TC
生产的源程序的注释只有/* */,而VC支持//,要区别对待。找到/*之后,直接跳到下一个*/,找到//则绕过一行。每找到一个字符还是判断,是否和前面已找到的字符重复,如果重复则跳过它。下面的程序通过
TC
3.0 和VC6支持编译。并且适用于
TC
和VC源程序,如果要适用其它语言,稍作修改即可。
show_hzk.rar_Hzk
字库
_
TC
2.0_hzk
显示
_show_
tc
2.0 hzk
TC
2.0下利用汉
字库
显示
汉字
,上传文件提供了
字库
,代码在
TC
2.0环境下可直接使用.
C语言西文模式下
显示
汉字
和
汉字
旋转及任意字体编译合并9.6MB超容量启动软盘映像下载
这是一个9.6MB的超容量启动软盘映像,可以直接挂载到VMwaer 7.0及以上版本的虚拟机软驱启动虚拟机并运行中国航天的
汉字
系统。本人用
TC
2.0编译了从12X12、14X14、16X16、24X24K、32X32、40X40、48X48点阵
汉字
共7个
汉字
系统的启动画面,其名称分别为:CH12.EXE、CH14.EXE、CH16.EXE、CH24K.EXE、CH32.EXE、CH40.EXE、CH48.EXE,其中除24X24K画面为楷体且主题字作了横向放大外,其它画面均为宋体并未作放大(在本人上传的源文件中有字体的放大参数,喜欢的朋友在研究编译时可修改),这7个启动画面运行均需对应汉
字库
的支持,其中12X12、14X14、16X16、32X32是全码
字库
,只需对应汉
字库
支持;CH24K.EXE、CH40.EXE、CH48.EXE是非全码
字库
,需要对应汉
字库
(7个汉
字库
在上传包内)和
TC
的TRIP.CHR文件共同支持,若缺
TC
的TRIP.CHR文件,则西文字母将无法正确
显示
。本人一并上传了3个
TC
的源文件,即:CH14.C、CH32.C、CH48.C供下载的朋友参考,其实3个文件虽各有自己的风格,不过,要做成上述7个画面,只用CH48.C一个文件就可以完成,自己只作部分参数的修改即可。本人还上传了CH.EXE和CHXT.EXE两个文件,CH.EXE是一个自带汉
字库
和VGA驱动的
汉字
系统启动画面文件,无需任何汉
字库
和
TC
环境的支持就可在西文环境下独立运行,如果与CHCS
汉字
系统在同一个目录,则关闭画面的同时即可启动该
汉字
系统,否则返回西文环境,该文件自带汉
字库
,使用了88X88(幸福家,其中“福”字是倒写的)、56X56点阵华文行楷、36X36点阵隶书、32X32点阵华文新魏、24X24点阵方正舒体、16X16点阵宋体等字体;CHXT.EXE画面是一个
汉字
经过不同角度旋转的文件,需24X24S
字库
和TRIP.CHR的支持才能正常
显示
,该文件关闭后不启动
汉字
系统,在此只供朋友们欣赏。以前上传的启动画面文件由于本人未作BGI驱动合并处理,也未上传支持该文件的BGI文件,以致下载的朋友在运行时出现错误,无法运行,本人在此特向这些朋友致歉,本次上传文件已作了改动,朋友们可放心的运行就是了。
C语言-
汉字
显示
与放大
用C语言编写一个
汉字
显示
与放大程序,设计完成一个能够从
字库
文件中调出
汉字
点阵信息并把它
显示
放大的程序,该程序能够根据需要放大倍数,
显示
在屏幕上。 使用UCDOS下的基本汉
字库
(16点阵)和graphic.h库中的作图函数,在
TC
2中用二维字符型数组来接
汉字
点阵信息,最终在图形化界面下作出
汉字
图形。
16*16点阵汉
字库
适用于C语言编程中
汉字
显示
程序。以下是使用范例: #include #include #define ROW 1 #define COL 2 void main() { int x,y; char *s="文字
显示
示例,这是一行文字。";/*
汉字
中不能夹杂英文*/ FILE *fp; char buffer[32]; register m,n,i,j,k; unsigned char qh,wh; unsigned long offset; int gd=DETECT,gm=0; initgraph(&gd,&gm,"C:\\TURBOC2"); /*这里是
tc
安装路径中的bgi目录,请替换为您的安装路径*/ if ((fp=fopen("C:\\TURBOC2\\dianzhen.hzk","rb"))==NULL) { printf("Can't open dianzhen.hzk,Please add it"); ge
tc
h(); closegraph(); exit(0); /*好处?*/ } x=20; y=100; while(*s) { qh=*(s)-0xa0; wh=*(s+1)-0xa0; offset=(94*(qh-1)+(wh-1))*32L; /*16*16点阵*/ fseek(fp,offset,SEEK_SET);/*在
字库
文件中定位当前位置*/ fread(buffer,32,1,fp); /*从当前位置读取数据*/ for (i=0;i<16;i++) /*16行*/ for(n=0;n
(7-k))&0x1)!=NULL) /*i=0,j=0,k=0*/ putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,GREEN);/*32*16
显示
,横向拉长一倍*/ s+=2; x+=32; } ge
tc
h(); closegraph(); }
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章