GB2312介绍及字库使用

来源:互联网 发布:手机淘宝删不了评价 编辑:程序博客网 时间:2024/05/18 05:13

一:先上图看效果,下面截图是android上测试的结果“SD卡测试”、、“GPS测试”等字符都是24x24字库里面来的。


二:

 1)简介

     《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980

GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。
   2)收录

GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
   3)分区表示

GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
   4)字节结构

在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是 72*94=6768。其中有5个空位是D7FA-D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。区位码=区字节+位字节(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
          


      

三:代码实现

其中用到的hkk.h库文件我已经上传的CSDN(http://download.csdn.net/detail/funbox/7650167)上面,有用到的朋友可以下载使用

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <stdio.h>#include <unistd.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <sys/mman.h>#include <linux/fb.h>#include <linux/android_pmem.h>#include "hkk24.h"typedef unsigned long  U32;typedef unsigned short U16;typedef unsigned char  U8;U8* string_def[] = {{" SD卡测试"},{" Camera测试"},                    {"音频测试"},{"重力传感器"},                    {" LCD测试" },{" GPS测试"},                    {"背光测试"},{"触屏测试"},                    {"按键测试"},{" OTG测试"},                    {"蓝牙测试"},{" WIFI测试"},                    {" HDMI测试"},{" NFC测试"},                    {"指南针测试"},{"陀螺仪测试"},              };/*=============================================================================== Function : PutPixel 功能     :画单个像素(一个点) 入口参数 :U16 x:点的X坐标   U16 y:点的y坐标   U16 c:点的颜色===============================================================================*/void PutPixel(U16 x, U16 y){     set_pixel(x, y, 0, 0, 255, 0);}/*=============================================================================== Function : WriteHZ24 功能  :画中文24点阵汉字 入口参数 :U16 x:汉字X坐标    U16 y:汉字Y坐标    U16 c:汉字颜色    U16 bk_c:汉字背景颜色    U32 addr:汉字所在地址===============================================================================*/void WriteHZ24(U16 x, U16 y, U16 c, U16 bk_c, U32 addr){U16 i16, j16, zg;U32 mask, buf;U8 const *pZK;  pZK = &HZ24KFont[addr];for(i16=0; i16<24; i16++){buf= pZK[3*i16]<<16 | pZK[3*i16 + 1]<<8 | pZK[3*i16 + 2];mask = 0x800000;for(j16=0; j16<24; j16++){if(buf & mask){PutPixel(x+j16,y+i16);}else{ //*addr_ptr = bk_c;  //??????????????}mask = mask >> 1;}}}/*=============================================================================== Function : WriteEN24 功能  :画英文24*16点阵汉字 入口参数 :U16 x:汉字X坐标    U16 y:汉字Y坐标      U16 c:汉字颜色    U16 bk_c:汉字背景颜色    U32 addr:英文所在地址===============================================================================*/void WriteEN24(U16 x, U16 y, U16 c, U16 bk_c, U32 addr){U16  i16, j16, zg;U32  mask, buf;U8 const *pZK;  pZK = &ENG24Font[addr];for(i16=0; i16<24; i16++){  buf= pZK[2*i16]<<8 | pZK[2*i16 + 1];  mask = 0x8000;  for(j16=0; j16<24; j16++)  {  if(buf & mask) {  PutPixel(x+j16,y+i16);  } else { //*addr_ptr = bk_c;  }  }                  mask = mask >> 1;}}/*=============================================================================== Function : Lcd_Put24 功能     :画24点阵的文字 入口参数 :U16 x:文字X坐标    U16 y:文字Y坐标    U16 c:文字颜色    U16 bk_c:文字背景颜色    U8* string:文字内容===============================================================================*/void Lcd_Put24(U16 x, U16 y, U16 c, U16 bk_c, U8* string){  U8  i8;  U16 Block, Pos;  U16  nm;  U32 addr;  U8 size;   //printf("Lcd_Put24 string = %s\n",string);   size = strlen(string);    for(i8 = 0;i8 < size;i8++)    {        printf("string[%d]:%x\n",i8,string[i8]);    }    for(i8=0; i8<size; i8++)    {      if(string[i8]==0)          break;      if(string[i8]>128)      {          nm = 0;           Block = string[i8];          Pos   = string[++i8];          nm = Block<<8|Pos;          //nm = 0xb0a1;          printf("nm = 0x%x\n",nm);  //addr = (((nm>>8) - 0x0b0 )*94 + ((nm&0x00ff) - 0xa1  )+1410)*72;          addr = (((nm>>8) - 0xa1 )*94 + ((nm&0x00ff) - 0xa1))*72;  WriteHZ24(x+i8*13, y, c, bk_c, addr);      } else {    addr = (2*94+(string[i8]-0x21))*72;    WriteHZ24(x+i8*15, y,c,bk_c,addr);    //addr = (string[i8]-0x20)*48;    //WriteEN24(x+i8*13, y,c,bk_c,addr);     }   }}int main(int argc, char ** argv){    U8 i8;    gr_init();    draw_line(0,0,300,300);    Lcd_Put24(0,0,0,0,"啊薄病场础怠丁贰浮埂骸尽取摇堋妗稹鳌齄亚忆");    Lcd_Put24(0,50,0,0,"Yayi");    for(i8 = 0;i8 < 8;i8++) {       Lcd_Put24(0,100+i8*50,0,0,string_def[i8*2]);       Lcd_Put24(300,100+i8*50,0,0,string_def[i8*2+1]);    }    exit(EXIT_SUCCESS);}





0 0