GB18030.hz 包括 0x df400 字节,共有28576个汉字或字符的 16x16 点阵信息
从0x00000-0xdf400 包含的点阵字库信息按顺序依次如下:
双字节2区:码位数6768 该区第一个字库偏移值为:int offset_2_2=0*32;
双字节3区:码位数6080 该区第一个字库偏移值为:int offset_2_3=6768*32;
双字节4区:码位数8160 该区第一个字库偏移值为:int offset_2_4=(6768+6080)*32;
四字节1区:码位数161 (从0x8139EE39~0x8139FE39) 该区第一个字库偏移值为:int offset_4_1=(6768+6080+8160)*32;
四字节2区:码位数6369 (从0x82308130~0x82358738) 该区第一个字库偏移值为:int offset_4_2=(6768+6080+8160+161)*32;
双子节1区:码位数 846 该区第一个字库偏移值为:int offset_2_1=(6768+6080+8160+161+6369)*32;
双子节5区:码位数 192 该区第一个字库偏移值为:int offset_2_5=((6768+6080+8160+161+6369+846)*32;
//设置偏移值,可用下面程序查看每一区首字符及各个字符
//查看GB18030.hz源程序
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
using namespace std;
const char *filename = "GB18030.hz";
void GetGB18030Point(bool(*b)[16], int offset)
{
FILE *fp = fopen(filename, "rb");
if (fp == NULL)
{
printf("无法打开%s文件\n", filename);
return;
}
fseek(fp, offset, SEEK_SET);
char tem[32];
fread(tem, 32, 1, fp);
int i, j, k;
for (i = 0; i < 16; i++)
for (j = 0; j < 2; j++)
for (k = 0; k < 8; k++)
{
if (tem[i * 2 + j] << k & 0x80)
b[i][j * 8 + k] = true;
else
b[i][j * 8 + k] = false;
}
fclose(fp);
}
int main()
{
int i, j;
int offset = (21008 + 161 + 6369 + 846) * 32;
bool b[16][16];
for (; 1; offset += 32)
{
GetGB18030Point(b, offset);
for (i = 0; i < 16; i++)
{
for (j = 0; j < 16; j++)
if (b[i][j])
cout << "* ";
else
cout << " ";
cout << endl;
}
cout << "当前字符汉字库偏移地址为 " << offset / 32 << "*32" << endl
<< "按任意键查看下一个" << endl;
_getch();
}
}
//附标准GB18030点阵汉字库排列偏移值计算函数
/*
unsigned long GetStdGB18030HzkAddr(unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4)
{//标准GB18030字库中偏移地址计算
const int BaseAdd = 0;//BaseAdd 为字库在文件中或其他中的偏移地址
unsigned long h = 0;
if (c1 >= 0xA1 && c1 <= 0Xa9 && c2 >= 0xa1) //双字节1区
h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
else if (c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //双字节5区
{
if (c2 > 0x7f)
c2--;
h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
}
else if (c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //双字节2区
h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 846 + 192;
else if (c1<0xa1 && c1 >= 0x81 && c2 >= 0x40) //双字节3区
{
if (c2>0x7f)
c2--;
h = (c1 - 0x81) * 190 + (c2 - 0x40) + 846 + 192 + 6768;
}
else if (c1 >= 0xaa && c2<0xa1) //双字节4区
{
if (c2>0x7f)
c2--;
h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 846 + 192 + 6768 + 6080;
}
else if (c1 == 0x81 && c2 >= 0x39) //四字节1区
h = (c3 - 0xEE) * 10 + c4 - 0x39 + 1038 + 21008;
else if (c1 == 0x82)//四字节2区
h = (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30 + 1038 + 21008 + 161;
return h * 32 + BaseAdd;
}
*/