打印
[技术问答]

在自定义的数组中查找汉字位置的方法

[复制链接]
2203|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
niuyaliang|  楼主 | 2014-4-11 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如我们需要显示16*16的字膜,首先,我们定义一个结构体
struct typFNT_GB // 汉字字模显示数据结构
{
uint8_t Index[2];//汉字索引内码
uint8_t Mask[32];//字符点阵16*16/8=32
};
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]
struct typFNT_GB  const GB1616[] = 
{ // 实际大小为14*14取膜,添加为16*16
"确",0x00,0x00,0x00,0x80,0x00,0xF8,0x7D,0x08,0x12,0x10,0x11,0xFC,0x21,0x24,0x3D,0x24,
0x65,0xFC,0x25,0x24,0x25,0x24,0x25,0xFC,0x3D,0x24,0x21,0x24,0x02,0x0C,0x00,0x00,/*"确",0*/
}

使用特权

评论回复
板凳
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 | 只看该作者
然后是区位码的概念
    区位码是一个四位的十进制数,每个区位码都对应着一个唯一的汉字或符号,它的前两位叫做区码,后两位叫做位码。

使用特权

评论回复
5
niuyaliang|  楼主 | 2014-4-11 22:54 | 只看该作者
最后是汉字的内码
    将ASCII表的高128个很少用到的数值以两个为一组表示数字,即为汉字的内码;剩下的低128位留给英文字符使用,即英文的内码。所以在一个字符串中,若一个字符大于128,那么就和下一个字符组成一个汉字,否则就是一个英文字符 。

使用特权

评论回复
6
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

使用特权

评论回复
7
niuyaliang|  楼主 | 2014-4-11 23:14 | 只看该作者
然后我们定义一个指针数组,指向需要显示的汉字
uint8_t *MenuRoot[1]={                                                                                                                                
"确",//
};

使用特权

评论回复
8
niuyaliang|  楼主 | 2014-4-11 23:25 | 只看该作者
然后我们查找“确”在自定义字库GB1616[]中的位置
未完待续

使用特权

评论回复
9
小蝎| | 2014-5-8 11:29 | 只看该作者
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗?

使用特权

评论回复
10
niuyaliang|  楼主 | 2014-5-8 15:47 | 只看该作者
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...

:lol发了这么久的帖子了,终于有人捧场啦,哈哈

使用特权

评论回复
11
niuyaliang|  楼主 | 2014-5-8 15:47 | 只看该作者
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...

:lol发了这么久的帖子了,终于有人捧场啦,哈哈

使用特权

评论回复
12
niuyaliang|  楼主 | 2014-5-8 15:51 | 只看该作者
本帖最后由 niuyaliang 于 2014-5-8 15:53 编辑
小蝎 发表于 2014-5-8 11:29
您好! 请教一下如何查找“确”在自定义字库GB1616[]中的位置,能贴个代码学习下吗? ...
/*---------------------------------查找汉字地址--------------------------------*/        
uint8_t GetWordAddress( uint8_t *ptr )                              
{
        uint8_t addr;

         for (addr=0;addr<sizeof(GB1616)/sizeof(GB1616[0]);addr++)                                   // 查找定位
          {
            if (( *ptr == GB1616[addr].Index[0]) && ( *(ptr+1) == GB1616[addr].Index[1]))//
                   {
//                printf("*ptr is %d\n",*ptr);
//                printf("*(ptr+1) is %d\n",*(ptr+1));
//                printf("84位汉字 %d\n",GB1616[84].Index[0]);
//                printf("84位汉字 %d\n",GB1616[84].Index[1]);
                break;
                }
         }
         return addr;
}

使用特权

评论回复
13
373810773| | 2014-5-10 18:38 | 只看该作者
学习了。

使用特权

评论回复
14
373810773| | 2014-5-10 18:38 | 只看该作者

使用特权

评论回复
15
zxf0168| | 2014-5-11 13:25 | 只看该作者
373810773 发表于 2014-5-10 18:38
学习了。

好好学习天天向上

使用特权

评论回复
16
zxf0168| | 2014-5-11 13:28 | 只看该作者
大多数时候我觉得那些所谓的工具,帮人的时候也在害人,我们总是在找简便方法,到头来我们却连最基本的原理都不知道

使用特权

评论回复
17
zxf0168| | 2014-5-11 13:29 | 只看该作者
每次看你的帖子总是心旷神怡,豁然开朗

使用特权

评论回复
18
戴风海| | 2017-4-14 12:10 | 只看该作者
请问如果查找到自定义的字的地址后,怎样将这个字用点阵来显示呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

2427

帖子

7

粉丝