您的位置:首页 > 其它

GBK字库制作、字模数据读取、使用

2016-06-10 00:45 381 查看
最近因为工作需要,学习了一下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 <sys/stat.h>
#include <stdio.h>

#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 <sys/stat.h>
#include <stdio.h>

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打不开,原因待查。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gbk制作 读取