一般我们使用 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
阅读(1982) | 评论(0) | 转发(0) |