最近因为工作需要,学习了一下GBK相关的知识,关于gbk的介绍请参照http://blog.sina.com.cn/s/blog_49677f890102w51b.html。
本文从三个小方面来讲述一下gbk的学习-gbk字库的制作;从gbk字库中读取某一个汉字的字模数据;利用字模数据打印出汉字
1、gbk字库的制作(感谢战舰)
相关软件下载:http://download.csdn.net/detail/scalerzhangjie/9545477
软件配置如下所示,点击创建后提示输入文件名称,之后就会生产gbk字库文件(大小是766080字节)。
如果嫌麻烦,可以直接到如下网址下载:
http://download.csdn.net/detail/scalerzhangjie/9545480
(字库名称为:GBK.DZK,下文会用到)
2、从gbk字库中读取某一个汉字(苹)的字模数据
代码如下:
#include
#include
#define FILE_NAME "GBK.DZK"
#define STR_HZ "苹"
int get_gbk_offset(char * hz_code)
{
unsigned char high = hz_code[0];
unsigned char low = hz_code[1];
printf("high:%x, low:%x\n", high, low);
if (low < 0x80)
{
return ((high-0x81)*190 + (low-0x40))*32;
}
else
{
return ((high-0x81)*190 + (low-0x41))*32;
}
}
unsigned char gbk_hz_buf[100000000];
long file_size(const char *file)
{
int i = 0;
int offset = 0;
long length = -1;
FILE *fp = fopen(file, "rb+");
if (fp == NULL) {
return length;
}
fseek(fp, 0, SEEK_END);
length = ftell(fp);
rewind(fp);
fread(gbk_hz_buf, 1, length, fp);
offset = get_gbk_offset(STR_HZ);
for (i = 0; i < 32; i++)
{
printf("0x%x, ", gbk_hz_buf[offset+i]);
if ((i+1)%4 == 0)
{
printf("\n");
}
}
printf("\n");
fclose(fp);
return length;
}
void main(void)
{
long size = 0;
size = file_size(FILE_NAME);
return ;
}
0x8, 0x20, 0x8, 0x20,0xff, 0xfe, 0x8, 0x20,0x0, 0x0, 0x7f, 0xfc,0x1, 0x0, 0x11, 0x10,
0x9, 0x10, 0x9, 0x20,0x1, 0x0, 0xff, 0xfe,0x1, 0x0, 0x1, 0x0,0x1, 0x0, 0x1, 0x0。
3、利用字模数据打印出汉字
程序如下:
#include
#include
unsigned char Hz_code[] = {
0x8, 0x20, 0x8, 0x20,
0xff, 0xfe, 0x8, 0x20,
0x0, 0x0, 0x7f, 0xfc,
0x1, 0x0, 0x11, 0x10,
0x9, 0x10, 0x9, 0x20,
0x1, 0x0, 0xff, 0xfe,
0x1, 0x0, 0x1, 0x0,
0x1, 0x0, 0x1, 0x0
};
#define RIGHT_SHIFT_VAL(x, n) (((x)>>(n)) & 0x01)
void prt_one_Hz(void)
{
int tbl_size = sizeof(Hz_code)/sizeof(char);
short int temp_code = 0;
int i = 0, j = 0;
for (i = 0; i < tbl_size; i+=2)
{
temp_code = Hz_code[i]<<8 | Hz_code[i+1];
for (j = 16; j > 0; j--)
{
if (RIGHT_SHIFT_VAL(temp_code, j-1))
{
printf("●");
}
else
{
printf("○");
}
}
printf("\n");
}
}
void main(void)
{
prt_one_Hz();
return ;
}
运行结果如下:
示例较简单,仅作入门参考。
目前遇到的一个问题,生成的字库在linux下面用不了,fopen打不开,原因待查。