• GB2312引进和使用的字体


    一个:先上图看到的结果,下面的屏幕截图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 ",string); size = strlen(string); for(i8 = 0;i8 < size;i8++) { printf("string[%d]:%x ",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 ",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); }






    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    个人管理:2,3月微薄整理
    ORM相关图片整理
    LmgORM项目 实体类转换器
    (转)Enterprise Architect 7.0入门教程
    禁止右键复制的代码
    UML示例图(转)学习
    Flash FMS Helloword
    模拟生成Guid
    Flash Media Server安装
    WebSphere创建删除概要文件
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4659405.html
Copyright © 2020-2023  润新知