首页 > 其他分享 >添加汉字库(二)——汉字字模存储和提取的方法

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

时间:2022-09-30 22:35:03浏览次数:71  
标签:存储 字模 locay 区位码 输入法 汉字 汉字库 32


汉字库,新华字典也!

一、引言


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


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

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

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


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.非完整汉字库的建立

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


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,就输入了“宝”字。这种数字也是有含义的,它们与每个汉字或字母符号所在的区和位是一一对应的。

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



区位码输入法是用数字代替字母的输入法,一般是用编码打字.


(内含拼音输入法源程序)


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

五、体悟

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

标签:存储,字模,locay,区位码,输入法,汉字,汉字库,32
From: https://blog.51cto.com/u_15812463/5727460

相关文章