漢字點陣
在漢字的點陣字庫中,每個字節的每個位都代表一個漢字的一個點,每個漢字都是由一個矩形的點陣組成,0代表沒有,1代表有點,將0和1分別用不同顏色畫出,就形成了一個漢字,常用的點陣矩陣有12 * 12, 14 * 14, 16 * 16三種字庫。
我:第46區第50位。 hzk: 16*16點陣
offset(漢字偏移量) : ((區號 - 1) * 94 +(位號 - 1) ) * 32
先嘗試打印1個漢字點陣:
/*讀取16*16的漢字庫文件,顯示指定的漢字點陣到字符界面上*/
unsigned char mat[16][2];//存儲待顯示漢字的點陣:16*16占32個字節
unsigned char chinese[3] = "愛";//待顯示的漢字
FILE* hzk; //指向漢字庫文件的指針
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打開錯誤!");
exit(0);
}
int i = chinese[0] - 0xa0;//計算漢字的區號
int j = chinese[1] - 0xa0;//計算漢字的位號
long offset = ((i - 1) * 94 + (j - 1)) * 32;//計算當前漢字在漢字庫文件中的偏移量
fseek(hzk, offset, SEEK_SET);//從文件開始定位指針到該字的偏移量處
fread(mat, 32, 1, hzk); //讀取32個字節到字模數組中
for (i = 0; i < 16; ++i)//循環顯示點陣的每一行
{
//每一行顯示2個字節的點陣信息
for (j = 0; j < 2; ++j)
{
//顯示一個字節的8個比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//該位為1
{
printf("o");
}
else
{
printf(" ");
}
}
}
printf("\n"); //每行打印完換行
}
fclose(hzk);
之后嘗試多個字符顯示:
得注意漢字不是一個接一個輸出,而是先輸出則會整個第一行
/*讀取16*16的漢字庫文件,顯示多個漢字(注意不能太多,否則控制台顯示不下)點陣到字符界面上*/
unsigned char mat[16][2];//存儲待顯示漢字的點陣:16*16占32個字節
unsigned char chinese[] = "人與世界";//待顯示的漢字
FILE* hzk; //指向漢字庫文件的指針
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打開錯誤!");
exit(0);
}
for (int i = 0; i < 16; ++i)//循環顯示點陣的每一行
{
//顯示字符串中所有漢字的第i行
for (int index = 0; index < strlen((char*)chinese) / 2; index++)
{
int i0 = chinese[index * 2] - 0xa0;//計算漢字的區號
int j0 = chinese[index * 2 +1 ] - 0xa0;//計算漢字的位號
long offset = ((i0 - 1) * 94 + (j0 - 1)) * 32;//計算當前漢字在漢字庫文件中的偏移量
fseek(hzk, offset, SEEK_SET);//從文件開始定位指針到該字的偏移量處
fread(mat, 32, 1, hzk); //讀取32個字節到字模數組中
//每一行顯示2個字節的點陣信息
for (int j = 0; j < 2; ++j)
{
//顯示一個字節的8個比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//該位為1
{
printf("o");
}
else
{
printf(" ");
}
}
}
}
printf("\n"); //每行打印完換行
}
fclose(hzk);
輸出效果:

嘗試把漢字輸入到文件中去:
/*讀取16*16的漢字庫文件,顯示多個漢字點陣到文本文件中*/
unsigned char mat[16][2];//存儲待顯示漢字的點陣:16*16占32個字節
unsigned char chinese[] = "東風快遞";//待顯示的漢字
FILE* hzk; //指向漢字庫文件的指針
FILE* fout;
if ((hzk = fopen("hzk16.txt", "rb")) == NULL)
{
printf("hzk16.txt文件不存在或者打開錯誤!");
exit(0);
}
fout = freopen("hz.txt", "w", stdout); //將標准輸出流stdout(代表顯示器)的數據重定向到文件中
for (int i = 0; i < 16; ++i)//循環顯示點陣的每一行
{
//顯示字符串中所有漢字的第i行
for (int index = 0; index < strlen((char*)chinese) / 2; index++)
{
int i0 = chinese[index * 2] - 0xa0;//計算漢字的區號
int j0 = chinese[index * 2 +1 ] - 0xa0;//計算漢字的位號
long offset = ((i0 - 1) * 94 + (j0 - 1)) * 32;//計算當前漢字在漢字庫文件中的偏移量
fseek(hzk, offset, SEEK_SET);//從文件開始定位指針到該字的偏移量處
fread(mat, 32, 1, hzk); //讀取32個字節到字模數組中
//每一行顯示2個字節的點陣信息
for (int j = 0; j < 2; ++j)
{
//顯示一個字節的8個比特信息
for (int k = 0; k < 8; ++k)
{
if (mat[i][j] & (0x80 >> k))//該位為1
{
fprintf(fout,"o");
}
else
{
fprintf(fout," ");
}
}
}
}
fprintf(fout,"\n"); //每行打印完換行
}
fclose(hzk);
fclose(fout);
freopen("CON", "w", stdout);//CON為windows操作系統的命令行窗口的輸入
printf("點陣顯示完畢,請查看文件hz.txt");
輸出效果:

