Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-12-29 10:33:49

    一般我们使用 16*16 的点阵字库,所谓 16*16,是每一个汉字在纵、横各 16 点的区域内显示的。不过后来又有了 24*24、32*32 和 48*48 点阵字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的,即符合 GB2312 标准的GB2312 汉字是由两个字节编码的,范围为 0xA1A1-0xFEFE,前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录 94 个汉字,位号则为该字在该区中的位置。
    HZK16 字库是符合 GB2312 标准的 16*16 点阵字库,下面以汉字 “中” 为例,介绍如何在 HZK16 文件中找到它对应的 32 个字节的字模数据。“中” 的国标码是 0xD6D0,因此:
区码 = 0xD6 - 0xA0位码 = 0xD0 - 0xA0(减 0xA0 是因为汉字是从 0xA0A0 开始编码的)
    这样我们就可以得到汉字 “中” 在 HZK16 中的偏移位置:
    offset = (94 * (区码-1) + (位码-1)) * 32
    区码减 1 是因为数组是以 0 为开始而区号位号是以 1 为开始的。

    /* 汉字库简单使用 */
    wchar_t val = L"中";
    fd_hzk16 = open("HZK16", O_RDONLY);    //打开字库文件
    if(fd_hzk16 < 0)
    {
        printf("can't open HZK16\n");
        return -1;
    }
    fstat(fd_hzk16, &hzk16_stat);
    hzk16_mem = (unsigned char *)mmap(NULL , hzk16_stat.st_size, PROT_READ, MAP_SHARED, fd_hzk16, 0);    //将点阵字库映射到进程地址空间
   
area = (int)((val >> 8) & 0xff) - 0xA1;   
    where  = (int)(val & 0xff) - 0xA1;   
    buf = hzk16_mem + (area * 94 + where) * 32;    //取出点阵数据
    ……    /* 在LCD上描画点阵数据 */


扩展:C 语言中宽字符使用
    定义:wchar_t *wstr = L"中国abc";
    计算字符长度:wcslen(wstr) 或 sizeof(wstr)/sizeof(wstr[0])
注意:
sizeof(wstr) = 12 字节,5 个字符加一个结束符 '\0',每个字符在宽字符中占据 2 个字节。

相关资料下载: 

                       ——忠于梦想 勇于实践    linux_xpj@opencores.org

阅读(1932) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~