日志档案

发表于 2007-12-15 20:38:50

1

标签: GB18030  

制作提取GB18030字库

  在某些产品的显示部分(如点真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,我会尽快把资料发给你的.我也会尽快将资料上传上来的.

系统分类: 单片机   |   用户分类: 单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(459)    回复(9)  

投一票您将和博主都有获奖机会!

最新评论

  • fxjun

    2007-12-27 15:00:30

    邮箱:fuxiaojunfyq@163.com

  • JIMMY

    2008-1-2 12:45:50

    已经发过去了,请注意查收!

  • grace_cheng

    2008-1-10 19:21:34

    想要gb18030的资料~
    wwen_cheng@hotmail.com
    谢谢!

  • JIMMY

    2008-1-29 19:46:49

    早已发出,今天补上恢复,谢谢

  • hjd103011043

    2008-2-18 8:32:13

    您好,我想要gb18030的资料,麻烦您给我发一份好吗?

    我的邮箱 hjdlz_hjd@126.com.  谢谢!

  • 正在找,谢谢

    2008-4-12 22:23:21

    急寻,发一份吧,谢谢! 另外,请教老兄,怎样得到汉字的gb18030的内码? culcut@tom.com

  • soware

    2008-4-17 13:52:07

    老兄,给我发一份吧,soware@126.com

  • cccjjj

    2008-5-9 17:03:03

    谢谢啦,

  • boz

    2008-5-29 15:23:14

    请给我也发一份吧,baojj@tom.com,谢谢啦