[技术问答] 在自定义的数组中查找汉字位置的方法

[复制链接]
2664|17
 楼主| niuyaliang 发表于 2014-4-11 21:59 | 显示全部楼层 |阅读模式
比如我们需要显示16*16的字膜,首先,我们定义一个结构体
  1. struct typFNT_GB // 汉字字模显示数据结构
  2. {
  3. uint8_t Index[2];//汉字索引内码
  4. uint8_t Mask[32];//字符点阵16*16/8=32
  5. };
Index[2]为汉字的的内码,一个汉字由两个字符组成,即包括两个内码
Mask[32]为一个汉字的点阵数据,大小为16*16/8  = 32
 楼主| niuyaliang 发表于 2014-4-11 22:04 | 显示全部楼层
本帖最后由 niuyaliang 于 2014-4-11 22:10 编辑

然后定义一个结构体变量的汉字字膜数组
“确”对应Index[2],32个字节对应Mask[32]
  1. struct typFNT_GB  const GB1616[] =
  2. { // 实际大小为14*14取膜,添加为16*16
  3. "确",0x00,0x00,0x00,0x80,0x00,0xF8,0x7D,0x08,0x12,0x10,0x11,0xFC,0x21,0x24,0x3D,0x24,
  4. 0x65,0xFC,0x25,0x24,0x25,0x24,0x25,0xFC,0x3D,0x24,0x21,0x24,0x02,0x0C,0x00,0x00,/*"确",0*/
  5. }
 楼主| niuyaliang 发表于 2014-4-11 22:21 | 显示全部楼层
现在再来普及一下汉字内码的知识,首先说的是汉字字膜码(来自百度)
    为了将汉字的字形显示输出,汉字信息处理系统还需要配有汉字字模库,也称字形库,它集中了全部汉字的字形信息。需要显示汉字时,根据汉字内码向字模库检索出该汉字的字形信息,然后输出,再从输出设备得到汉字。
  所谓汉字字模就是用0、1表示汉字的字形,将汉字放入n行*n列的正方形内,该正方形共有n^2个小方格,每个小方格用一位二进制表示,凡是笔划经过的方格值为1,未经过的值为0。
  汉字点阵字模有16*16点、24*24点、32*32点,48*48点几种,每个汉字字模分别需要32、72、128、288个字节存放,点数愈多,输出的汉字愈美观。
 楼主| niuyaliang 发表于 2014-4-11 22:50 | 显示全部楼层
然后是区位码的概念
    区位码是一个四位的十进制数,每个区位码都对应着一个唯一的汉字或符号,它的前两位叫做区码,后两位叫做位码。
 楼主| niuyaliang 发表于 2014-4-11 22:54 | 显示全部楼层
最后是汉字的内码
    将ASCII表的高128个很少用到的数值以两个为一组表示数字,即为汉字的内码;剩下的低128位留给英文字符使用,即英文的内码。所以在一个字符串中,若一个字符大于128,那么就和下一个字符组成一个汉字,否则就是一个英文字符 。
 楼主| niuyaliang 发表于 2014-4-11 22:56 | 显示全部楼层
本帖最后由 niuyaliang 于 2014-4-11 22:59 编辑

几者之间的联系
    在计算机中英文一般使用 ASCII 码来表示,而汉字编码使用的是扩展 ASCII 码,用两个ASCII码来表示一个汉字。一个ASCII码占用一个字节,所有在存储时英文是占用一个字节,而汉字占用两个字节。
    扩展 ASCII 码:也就是 ASCII 码的最高位是1的 ASCII 码,一个汉字由两个扩展 ASCII 码组成,第一个扩展 ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码。
    汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中。具体的说就是:
汉字的   
    第一个扩展ASCII码 = 128+32 + 汉字区码
    第二个扩展ASCII吗 = 128+32 + 汉字位码

所以说,以“确”为例,确的区码为40,位码为23
则GB1616[0].Index[0] = 128+32+40 = 200
GB1616[0].Index[1] = 128+32+23 = 183
 楼主| niuyaliang 发表于 2014-4-11 23:14 | 显示全部楼层
然后我们定义一个指针数组,指向需要显示的汉字
  1. uint8_t *MenuRoot[1]={                                                                                                                               
  2. "确",//
  3. };
 楼主| niuyaliang 发表于 2014-4-11 23:25 | 显示全部楼层
然后我们查找“确”在自定义字库GB1616[]中的位置
未完待续
小蝎 发表于 2014-5-8 11:29 | 显示全部楼层
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗?
 楼主| niuyaliang 发表于 2014-5-8 15:47 | 显示全部楼层
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...

:lol发了这么久的帖子了,终于有人捧场啦,哈哈
 楼主| niuyaliang 发表于 2014-5-8 15:47 | 显示全部楼层
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...

:lol发了这么久的帖子了,终于有人捧场啦,哈哈
 楼主| niuyaliang 发表于 2014-5-8 15:51 | 显示全部楼层
本帖最后由 niuyaliang 于 2014-5-8 15:53 编辑
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...
  1. /*---------------------------------查找汉字地址--------------------------------*/        
  2. uint8_t GetWordAddress( uint8_t *ptr )                              
  3. {
  4.         uint8_t addr;

  5.          for (addr=0;addr<sizeof(GB1616)/sizeof(GB1616[0]);addr++)                                   // 查找定位
  6.           {
  7.             if (( *ptr == GB1616[addr].Index[0]) && ( *(ptr+1) == GB1616[addr].Index[1]))//
  8.                    {
  9. //                printf("*ptr is %d\n",*ptr);
  10. //                printf("*(ptr+1) is %d\n",*(ptr+1));
  11. //                printf("84位汉字 %d\n",GB1616[84].Index[0]);
  12. //                printf("84位汉字 %d\n",GB1616[84].Index[1]);
  13.                 break;
  14.                 }
  15.          }
  16.          return addr;
  17. }
373810773 发表于 2014-5-10 18:38 | 显示全部楼层
学习了。
373810773 发表于 2014-5-10 18:38 | 显示全部楼层
zxf0168 发表于 2014-5-11 13:25 | 显示全部楼层
373810773 发表于 2014-5-10 18:38
学习了。

好好学习天天向上
zxf0168 发表于 2014-5-11 13:28 | 显示全部楼层
大多数时候我觉得那些所谓的工具,帮人的时候也在害人,我们总是在找简便方法,到头来我们却连最基本的原理都不知道
zxf0168 发表于 2014-5-11 13:29 | 显示全部楼层
每次看你的帖子总是心旷神怡,豁然开朗
戴风海 发表于 2017-4-14 12:10 | 显示全部楼层
请问如果查找到自定义的字的地址后,怎样将这个字用点阵来显示呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部