Linux 下GB2312简体中文编码表(字库文件为hzk16,未上传)_1

来源:互联网 发布:mac口红铁锈红图片 编辑:程序博客网 时间:2024/05/19 18:37

1、用编辑器修改如下文本,并另存为GB2312格式,执行
-->
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(void){
        unsigned char buf[]="别";
        printf("%x %x\n",buf[0],buf[1]);
        return 0;
}
输出结果:      
b1 f0     //buf[0] 为区码  buf[1]为区内码
对照GB2312简体中文编码表标准:
别字编码标准 B1F0
------------------------------
GB2312简体中文编码表中指出:
GB2312-80 包含了大部分常用的一、二级汉字,和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中
文字符集,这也是最基本的中文字符集。其编码范围是高位 0xa1-0xfe,低位也是 0xa1-0xfe;汉字从 0xb0a1 开始,结束于 0xf7fe
共包含 682 个符号(第 01-09 区) 6763 个汉字(第 16-87 区)(以下第 01-09 区为国标符号,第 10-15 区为空区)

分析参考:
---------------------------
code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
B1A0    薄 雹 保 堡 饱 宝 抱 报 暴 豹 鲍 爆 杯 碑 悲
B1B0 卑 北 辈 背 贝 钡 倍 狈 备 惫 焙 被 奔 苯 本 笨
B1C0 崩 绷 甭 泵 蹦 迸 逼 鼻 比 鄙 笔 彼 碧 蓖 蔽 毕
B1D0 毙 毖 币 庇 痹 闭 敝 弊 必 辟 壁 臂 避 陛 鞭 边
B1E0 编 贬 扁 便 变 卞 辨 辩 辫 遍 标 彪 膘 表 鳖 憋
B1F0 别 瘪 彬 斌 濒 滨 宾 摈 兵 冰 柄 丙 秉 饼 炳

-----------------------------------------------------------
因此每个区内的字符共有:0xfe-0xa1+1=94
头文件
 hzk16 里面根据编码表的顺序存放每个字符的像素数据. 矩阵由16*16表示,
 即6行x16个像素, 因为字库里面只表示每个像素是否要显示, 所以只要一位
 就可以表示一个像素。因此:一个汉字的大小为:16x16bit, 32字节

--------------------------------------------------------- 
标准C如何通过偏移量寻得字库头文件中的矩阵:
--->
思路分析:先定位到区,然后计算出该区的偏移量,再在这基础上进行区内偏移
eg:(以别字为例) (buf[0]-0xa1)*94+(buf[1]+0xa1)即为该字的矩阵地址 
    当前汉字偏移地址=(区-区起始编码)*区内汉字总数+(区内码+区内起始编码)
 
====>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(void){
    unsigned char buf[]="±ò",data[32];
    unsigned short tmp=0;

    //printf("%x %x\n",buf[0],buf[1]);
    int fd,offset;
    offset=(buf[0]-0xa1)*94+(buf[1]-0xa1);
    fd=open("./hzk16",O_RDONLY);
    if(fd<0){
            perror("open hzk16");
            return 1;
    }
    lseek(fd,offset*32,SEEK_SET);   //偏移到需要打印的汉字位置
    read(fd,data,32);

    int x,y;
    for(y=0;y<16;y++){  //输出汉字矩阵
            tmp=(data[y*2])<<8|data[y*2+1];   //0,1;2,3;4,5;...
            for(x=15;x>=0;x--){
                    if(tmp&(1<<x))    //

                            printf("##");
                    else
                            printf("  ");
            }
            printf("\n");
    }
    return 0;
}

原创粉丝点击