标题:[分享]TC2.0 下汉字的显示
只看楼主
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
结帖率:100%
 问题点数:0 回复次数:5 
[分享]TC2.0 下汉字的显示
我这里是以16*16字模库说明的.
先说明一下原理:
所谓的16*16是一个汉字是存放格式:
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
总共16行16列,每一行占二个字节的空间,
每一个字节的的每一位是0表示不显示,1表示显示.

那如何得到汉字的字模信息呢?难道要我们自己去做?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字节信息即记录了该字的字模信息。
搜索更多相关主题的帖子: 汉字 分享 字模 原理 格式 
2007-04-13 22:01
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
得分:0 
我可以给出一个例程序:
#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); /*读取一个32个字节长度的信息到mat中*/

/*得到字模后,显示汉字*/
 for(j=0;j<16;j++)
  for(i=0;i<2;i++)
  for(k=0;k<8;k++)
/*扫描这个字节的每一位,如果是1则显示一个点,否则不显示*/
   if(mat[j][i] & (0x80>>k))/*0x80相当于:10000000 和字节作与运算时
如果最高位是1则与运算的结果是1,如果是0则与运算结果为0
0x80>>k是向右移位,当k==1时右移结果:01000000再与运算
如此循环完这个字节*/
   putpixel(i*8+k,j,RED);
getch();
 closegraph();
 fclose(HZK);
}
/*由于刚才上传hzk16字库不成功,要自己下,如果下不到
发信息到zhaoxufeng9997@126.com 我会发给你的*/

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-04-13 22:14
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
得分:0 

若 —— 您仅仅是为了使 C 程序中字符串(或 ASM 程序中的字符串)所包含的汉字能显示出来;
并 —— 您所编写的 C 程序(或 ASM 程序)运行在 Windows 的命令行控制台(cmd/command)中。
若您是为了学习汉字显示技术的原理,则以下介绍的方法并不适合您。


通过更改控制台 (cmd/command)的代码页显示汉字


你可以通过更改控制台的代码页来显示,您可以编写一个简单的程序以佐测试:
#include "stdio.h"
#include "conio.h"

int main(void)
{
printf("通过更改控制台代码页来显示汉字。");
getch();
return 0;
}

以上程序所生成的 EXE 文件在命令行控制台(cmd/command)下执行时显示的是乱码,
在该控制台窗口标题右击,选择[属性],您可以看到[选项]页中的[当前代码页]显示的是:
437 (OEM - 美国)

在 cmd 中,输入命令:chcp
可以查看当前活动的代码页,
您将可以看到是代码页是 936,
这是中文简体的代码页,cmd 启动后默认使用本地语言的代码页,
这也是为什么您能在 cmd 下看到中文及输入中文的原因。
而 TC (或 MASM) 所编译生成的文件是使用 command 来执行的,
command 默认使用的是 437 英文显示字符。

要更改代码页,先打开命令行控制台,(cmd/command),
并使用 graftabl 936 来启动图形屏幕汉字显示支持。
输入以下命令:
chcp 437
graftabl 936
你的程序.exe

您此时便可以看到程序中的中文能正确地显示。
为免麻烦,可以使用以下的批处理文件(myApp.exe 是您待运行的程序):
echo off
chcp 437
graftabl 936
cls
myApp.exe
pause


欢迎加入 MVC 技术讨论群(新群:90093426)
2007-04-13 23:10
帅浪
Rank: 1
等 级:新手上路
威 望:1
帖 子:139
专家分:0
注 册:2007-4-4
得分:0 

上面的Neverthesame 说的还不错!


世上事有难易乎?为之?则难者亦易矣;不为,则易者亦难矣
2007-04-13 23:37
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
得分:0 

谢谢!


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-04-14 17:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-131723-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.153304 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved