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

最近因为工作需要,学习了一下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字节)。

GBK字库制作、字模数据读取、使用_第1张图片

如果嫌麻烦,可以直接到如下网址下载:

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 ;
}


运行结果如下:

GBK字库制作、字模数据读取、使用_第2张图片
可知“苹”对应的字模数据是:

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 ;
}
运行结果如下:

GBK字库制作、字模数据读取、使用_第3张图片


示例较简单,仅作入门参考。

目前遇到的一个问题,生成的字库在linux下面用不了,fopen打不开,原因待查。

你可能感兴趣的:(Linux,C)