添加汉字库(二)——汉字字模存储和提取的方法

汉字库,新华字典也!

一、引言

耗了一整天宝贵时间,终于找到问题所在:是汉字取模软件的取模方式设置不对,导致显示类似乱码。如下图所示:




习惯性地,我将取点方式选择了“横向取点左高位”,而细思之后,发现我的程序是“纵向取点下高位”。

而我其实一开始就有觉得取模方式设置得有问题,但给自己的理由是:即便取反了,只不过是镜像,或者字体颠倒而已。现在,想来真是大大不同了。(发挥想象力)

下面是我关于取模显示的部分代码,贴出与大家共享:

DWORD LCDdisplay3232(BYTE locax,BYTE locay,BYTE *pdata)   //显示32*32点阵
{
	int i,j;
	unsigned long rslt;
    
    for(i=0;i<128;i++)                                   //32*32/8=128
	{
		for(j=0;j<8;j++)                         //因为是一字节8位
		{
		    Xadd(locax+(i%32),locax+(i%32));
		    if(i<32)                             //以下8行代码就是取模方式。很明显,我用的纵向取模,且高位在下方。(因为i是横轴,j是纵轴)
		        Yadd(locay*8+j,locay*8+j);
		    else if((i>=32)&&(i<64))
			    Yadd(locay*8+8+j,locay*8+8+j);
		    else if((i>=64)&&(i<96))
			    Yadd(locay*8+16+j,locay*8+16+j);
		    else if((i>=96)&&(i<128))
			    Yadd(locay*8+24+j,locay*8+24+j);
			if(pdata[i] & (1<<j))
			{
			    if(ucDefualtFColorSet ==0)
                {
    			    LCDCOM_MASTER(0x2C);
    				LCDDATA_MASTER(ucFrontColorSet1);
        		    LCDDATA_MASTER(ucFrontColorSet2);
			    }
                else
                {
                    continue;
                }
			}
			else
			{			
			    if(ucDefualtBColorSet ==0)
                {
                    LCDCOM_MASTER(0x2C);
    				LCDDATA_MASTER(ucBackColorSet1);
        		    LCDDATA_MASTER(ucBackColorSet2);
			    }
                else
                {
                    continue;
                }
			}
		}
	}
		
	if(locax+32>120) 
	{
		locay = locay + 4;
		locax = 0;
	}
	else	
	{
		locax = locax + 32;
	}
	
	rslt = ((locax)<<8) + locay;
	return rslt;
}



1.这个汉字库,搞死我了。不就金鹏二字,那么难显示吗?自己制作字库并显示,那么难吗?

到底哪里错了?

2.汉字会自动搜索吗?到底怎么实现自偏移和定位的?

难道是字形本身就是一种区位?然后可以一一对应,映射?也就是我写一个汉字,他必有字形。此字形就会自动与汉字库中的字形编码信息一一对应。那对应总得有程序啊?

答:既然每个区位码对应一个汉字,那么每个汉字也对应一个区位码。

【拓展1】:我们敲的汉字,是区位码输入法吗?若是,请问五笔,拼音与区位码输入法有何联系区别?

3.文献一《液晶显示器的汉字显示方法》

4.文献二《》

5.非完整汉字库的建立

几种小字库的创建方法和对应的字模提取方式

http://blog.csdn.net/pmind/article/details/6078166

6.说了这么多,还是没有任何实质性的突破啊。怎么办呢?哪里出差错了?

我现在要整体地安静地理解程序才行。

或者自己写个测试实例出来。

7.问题应该是出在取数组方面。尝试其它方法

8.另一问题是,我的理解有没错?底层函数有没错?



==============================================================================================

二、术语入门

1.汉字字模码

为了将汉字的字形显示输出,汉字信息处理系统还需要配有汉字字模库,也称字形库,它集中了全部汉字的字形信息。需要显示汉字时,根据汉字内码字模库检索出该汉字的字形信息,然后输出,再从输出设备得到汉字。

  所谓汉字字模就是用0、1表示汉字的字形,将汉字放入n行*n列的正方形内,该正方形共有n^2个小方格,每个小方格用一位二进制表示,凡是笔划经过的方格值为1,未经过的值为0。
  汉字点阵字模有16*16点、24*24点、32*32点,48*48点几种,每个汉字字模分别需要32、72、128、288个字节存放,点数愈多,输出的汉字愈美观。
  存放在磁盘上的字模库称为软字库,存放在由ROM组成的印刷线路板上的字模库称为硬字库,也称为“汉卡”。

2.区位码

国标码是一个四位十六进制数,区位码是一个四位的十进制数,每个国标码或区位码都对应着一个唯一的汉字或符号,但因为十六进制数我们很少用到,所以大家常用的是区位码,它的前两位叫做区码,后两位叫做位码。

    汉字库分布情况如下:
       一级汉字  16-55区
       二级汉字  56-87区
       三级汉字  1-9区
       空闲未用  10-15区

http://www.hudong.com/wiki/%E5%8C%BA%E4%BD%8D%E7%A0%81

3.内码


4.汉字机内码,区位码,国标码及其相互转换关系


5.区位码输入法,拼音输入法等区别联系。拼音输入法是基于区位吗输入法的吗?

拼音输入法是以汉语拼音为基础,直接运用西文键盘的字母键输入汉字的,当前,在我国使用较多的有全拼法,双拼法。区位输入法是利用区位码进行汉字输入的一种方法,又叫内码输入法。汉字区位码是一个四位的十进制数,属于流水码,不按字的音和形排列每个区位码都对应着一个唯一的汉字或符号,它的前两位叫做区号(或称“区码”),后两位叫做位号(或称“位码”)。例如,“宝”字的区位编码为1706,输入数字1706,就输入了“宝”字。这种数字也是有含义的,它们与每个汉字或字母符号所在的区和位是一一对应的。

简单的说区位码输入法是无重码,(它们与每个汉字或字母符号所在的区和位是一一对应的。)拼音码输入法,是有重码的,输入的拼音组合对应一组汉字。

区位码输入法是用数字代替字母的输入法,一般是用编码打字.
http://www.cnblogs.com/xilentz/archive/2010/06/10/1755598.html(内含拼音输入法源程序)

6.汉字库提取方法(计算公式)


五、体悟

1.放聪明点。能在大脑中做的事情就不要在手头写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值