📄 source.txt
字号:
在某些产品的显示部分(如点真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资料弄清以上程序,这样提取字库才不会出问题.上面的函数是按照字库中汉字的顺序存储在存储器中的情况编写的,有些时候为了提取或是使用方便,也可将字库处理后再存储.
总的说:提取字库就是一个通过汉字代码算出偏移量,通过偏移量找到汉字在存储器位置的过程.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -