原创 制作提取GB18030字库

2008-12-5 22:10 7009 6 28 分类: MCU/ 嵌入式

  在某些产品的显示部分(如点真LED,液晶屏等)往往都要显示汉字,而字库是这类产品系统中必不可少的,最近我也用到了字库这部分,在这里把我的心得和整理的资料分享下.


  GB18030字库是一个相对比较全的字库,大小不超过1M字节.本人存储器用的是29c040(两片),对29C040的读操作非常简单,类似于SRAM。主要是怎么样通过汉字的汉字代码找到汉字在存储器中的位置。GB18030每个汉字在存储器中占32字节,这样通过汉字代码算出偏移量,通过偏移量找到汉字在存储器中的位置。下面给出一个比较通用的计算偏移量的程序:


//-----------------------------------------------
//提取字库函数
//----------------------------------------------
unsigned long font_get_bmp_15_16(uchar  p_1, uchar p_2)
{
    unsigned char c1 = (unsigned char)p_1;
    unsigned char c2 = (unsigned char)p_2;


    unsigned long len = -1;


 const ulong  i_32 =32;
    if (c1 >= 0xb0 && c2 >= 0xa1)   
    {
        len = ((c1 - 0xb0) * 94 + (c2 - 0xa1)) * i_32;
    }


    if (c1 > 0x80 && c1 < 0xa1 && c2 >= 0x40)       {
        //len = ((c1 - 0x81) * 190 + (c2 - 0x40)) * i_32 + 6768 * i_32;
         
        len = ((c1 - 0x81) * 190 + (c2 - 0x40)) * i_32 + 6768 * i_32;
  if(c2>0x7e)  len-=i_32;
    }


    if (c1 >= 0xaa && c2 >= 0x40 && c2 < 0xa1)     {
       len = ((c1 - 0xaa) * 96 + (c2 - 0x40)) * i_32 + (6768 + 6080) * i_32;
       if(c2>0x7e)  len-=i_32;
    }

    if (len >= 0)
        return len; 


   /* if (c1 >= 0xa1 && c1 <= 0xa9 && c2 >= 0xa0)//0xa1  
        len = ((c1 - 0xa1) * 94 + (c2 - 0xa1)) * 32;
    if (c1 >= 0xa8 && c1 <= 0xa9 && c2 >= 0x40 && c2 <= 0xa0)  
        len = ((c1 - 0xa8) * 94 + (c2 - 0x40)) * 32 + 846 * 32;


    if (len >= 0)
        return len;*/
}


  以上程序是我在8位51单片机上写的,如果移植用注意变量INT型等的长度。函数内注释的部分也是用得到的,最好能通过GB18030资料弄清以上程序,这样提取字库才不会出问题.上面的函数是按照字库中汉字的顺序存储在存储器中的情况编写的,有些时候为了提取或是使用方便,也可将字库处理后再存储.


  总的说:提取字库就是一个通过汉字代码算出偏移量,通过偏移量找到汉字在存储器位置的过程.


  这里我讲的不是很详细,只是把我觉得有用的东西拿了出来,最好对没接触过字库的朋友有所帮助.


  本想在最后的附件中上传gb18030的资料和gb18030字库查看软件的,不过上传文件有大小限制,如果有什么需要的,请回复本文章并留下E-MAIL,我会尽快把资料发给你的.我也会尽快将资料上传上来的.


pdf  https://static.assets-stash.eet-china.com/album/old-resources/2008/12/5/5fcd43c6-257d-4d35-a8c2-2c7e4b377412.rarhttps://static.assets-stash.eet-china.com/album/old-resources/2008/12/5/a9fec3a3-22d6-41aa-9a73-93d68b5c8337.rar

文章评论22条评论)

登录后参与讨论

用户377235 2012-10-7 22:19

你好,我现在做个案子需要中文字库,麻烦传一份给我,谢谢,yannh33@163.com 谢谢了。

用户377235 2012-5-3 11:01

下载了字库,不过不太明白hz,zf文件中字库与GB18030中的字符是如何对应的,能不能有个说明呢

用户558117 2011-10-27 22:54

您好,请问代码部分只有两字节的处理,那四字节的应该怎么处理,很急,谢谢,如果有资料的话,请发我邮箱scut_ben@126.com,祝工作愉快!

用户93574 2011-3-23 20:50

fyyy4030@qq.com,请给我发一份》谢谢!

用户23619 2010-10-13 18:05

你好,我需要一份GB18030.dat,能否发给我呢? yangxuanzhi2007@sina.com.cn

用户230035 2009-10-22 22:50

有没有GB18030的12*12点阵字库啊?麻烦给传一份!谢谢!renphone100@sina.com

用户230035 2009-10-22 22:46

你好,我最近遇到问题,手上有GB2312和GBK的字库,但是没有GB18030的字库,导致在产品上某些字没法显示,不知道有您没有这方面的资料,请发一份给我,renphone100@sina.com

用户1481026 2009-9-25 20:13

求gb18030的资料和gb18030字库查看软件,最近在做16*16点阵的LED,希望能发给我些资料,谢谢!

用户227115 2009-7-13 09:39

thanks

用户1305670 2009-7-10 23:42

konson32@163.com
相关推荐阅读
用户106445 2011-01-05 22:17
C语言中常见的置位操作
如何对某一位置0或者置1?方法一:写成宏,方便移植#define setbit(x,y) x|=(1<<y) //将X的第Y位置1#define clrbit(x,y) x&=!(...
用户106445 2008-12-25 19:17
ST-BUS基本原理
 ST-BUS基本原理    ST-BUS(Serial Telecom BUS,串行通信总线)是卓联半导体公司根据电信应用的需要而定义的一种重要的通信设备内部总线通信协议,它可以将多路信息(包括音频...
用户106445 2008-12-25 18:58
无源晶体与有源晶振的区别、应用范围及用法
无源晶体与有源晶振的区别、应用范围及用法:1、无源晶体——无源晶体需要用DSP片内的振荡器,在datasheet上有建议的连接方法。无源晶体没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决...
用户106445 2008-12-13 20:39
更改XP收藏夹的位置
用户的收藏的网址系统默认存放在C:\Documents and Settings\username \收藏夹 里。但有时因为种种原因要重做系统时,应该把这个文件复制出来,在做完系统后把这个文件夹还原回...
用户106445 2008-12-05 22:24
令人头晕的指针
某种类型名   *)另一种类型指针变量名: 这个只是转换了指针类型。 *(某种类型名*)&另一种类型指针变量名     这个将   另一种类型指针的指针(地址)   转换成了   某种类型指针...
用户106445 2008-12-05 22:22
指针不完全手册2
第二节 指针的应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />1、 指针与变量定...
我要评论
22
6
关闭 站长推荐上一条 /2 下一条