目前位置: VCer资源中心 >>> VCer文章 >>> 软件工程

[本帖已阅读5200次 分值80 回复0次] 张贴资源 发回信箱 控制面板

白乔原创:DOS时代-汉字的处理技术(四)

提供者:bluejoe 张贴时间:2004-05-25 22:27:46.0 出处:vcer.net 作者:不祥

白乔原创:DOS时代-汉字的处理技术(四)(2004-05-25 22:27:46.0)


白乔


 
级别: VCer师长
头衔: VCer创始人

经验: 21093
作品: 513
分会: 华北分会
注册: 2003-12-01 09:20:32.0
登录: 2008-11-17 19:35:24.0

5.小汉字库的使用

需要注意是,在建立小汉字库的同时,最好还要记住其中的排列顺序,这样才能方便地通过索引数组来选择字模信息。静态库的内容可以通过test. txt来观察,而动态库的内容却不能直观地显示,如果忘了的话,我们编制以下的小工具来实现浏览功能:

现在我们假设已经知道了testl. hzk的内容为“青春工作室一九七年月”,我们将这些字标记以0-9,那么“一九九七年七月”可以用数组表达为{5667879},通过这个数组我们再从testl. hzk中读取字模再写出字来。具体实现过程描述如下:

当然,TextOut ()函数也可以再作修改。我们赋予索引数组一个通用的结束符,这样TextOut就可以减少一个参数num来标志汉字的个数。

C语言采用“\0”作为字符串中的结束符,但我们若也把它用作数组的结束符并不合适,因为我们有可能用到第0个汉字。当然,以(-1)作为结尾,问题就解决了。

在TextOut中加上判断语句就可以达到目的。

6.小汉字库的改进

前面建立的test. hzk的长度永远是32的倍数,但一旦我们为每个字模增加两个字节,TextOut ()函数的使用就方便得多。

读者是乐于用字符数组“一九九七年七月”来替换古板的{5667879-1}的,因为它的可读性大大增强,而且还免去了努力地记住小汉字库的排列顺序。

我们仍然采用动态建库方式,在写进字模之前,我们先将汉字的机内码(两个字节)写进去。在使用小汉字库的时候,先根据机内码进行判断再定位,再读取字模就可以写字了。

这样,字库的结构变成:

内码 | 字模 | 内码 | 字模

计算机是为我们服务的,它绝不会因为做的事情太多而大发牢骚,从而影响了工作的兴趣,这点读者应该明白,我们编出来的程序不应该要求用户记忆太多的东西(如前面的建库方式),甚至进行大量的计算——让计算机去干好了。

以下是改进后的建库程序:

程序生成的小汉字库名为test2. hzk(为了便于以后程序的调试,假设它的内容为“电脑汉字小爱好技术者库”)。

因为汉字的内码需要2个字节,如果构造一个WORD联合,将两个字节并在一块处理,这样的代码则更容易让人理解。

以下是如何使用它的例程:

7.将字库放进内存中去

硬盘的访问时间为ms级,内存的访问时间为ns级,内存的访问速度是硬盘的近1000倍。在大型程序中,当速度成为很突出的问题时,我们就必须考虑怎样加快字模的读取。既然小汉字库的体积很小,我们何不将它置于内存中去呢?

最好的方案是将这部分内存分成两部分:一部分用来存储内码,另一部分用来存储字模信息。这样就会加快运行速度。在以下的例程中,读取字库文件test2.hzk时,程序将内码置于hzcode数组中去,紧接着将字模信息置于hzp数组中去(它被中明为指向字符型指针的指针),当然,汉字的个数也该记录下来,以备后用。

本文曾经发表于《电脑爱好者》期刊杂志98年8期,版权CFan所有。

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2291.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

1082687209616[385,308字节]

得意,我用他的代码;

自豪,他用我的代码!

[回复该贴] [加入个人书签]
[连载系列]

[1] 白乔原创:DOS时代-汉字的处理技术(一)
[2] 白乔原创:DOS时代-汉字的处理技术(二)
[3] 白乔原创:DOS时代-汉字的处理技术(三)
[4] 白乔原创:DOS时代-汉字的处理技术(四)

[投票结果]

A: 评分 10 0% (0 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)