新普京网站-澳门新普京 > 计算机 > 16点阵字库的选取及示范程序,增加粤语字库

16点阵字库的选取及示范程序,增加粤语字库

2019/12/29 18:57

要求:原操作系统代码里只是永葆了德语呈现,须求做的是兑现对那么些系统的汉字全角扶持。

2017/07/02 更新,从前随手复制的外人的,只思索本人存档,所以格式没怎么管,但是看看500+阅读量感到挺对不起此前点开的朋友的,况且终于筹划好好经营那么些号了,所以能够收拾了眨眼间间。

hzk16的介绍以致轻便的行使方法

【转自 本人读书用 侵删】

HZK16字库是顺应GB2312标准的16×16点阵字库,HZK16的GB2312-80支撑的方块字有67六十六个,符号683个。当中顶级汉字有37五17个,按声序排列,二级汉字有3008个,按偏旁部首排列。我们在有的用参加合根本用不到如此多汉字字模,所以在接受时就足以只领到部分字体作为己用。

HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支撑的方块字有6765个,符号6八十三个。当中一级汉字有 3754个,按声序排列,二级汉字有3008个,按偏旁部首排列。

HZK16字Curry的16×16汉字风度翩翩共须求258个点来浮现,也便是说必要33个字节才干达到突显二个惯常汉字的指标。

大家在部分接受场所根本用不到这么多汉字字模,所以在利用时就能够只领到部分字体作为己用。

大家明白三个GB2312汉字是由多少个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每叁个区有九十多个字符(注意:这只是编码的认同限定,不明确都有字型对应,比方符号区就有不菲编码空白区域)。上面以汉字“作者”为例,介绍如何在HZK16文本中找到它对应的34个字节的字样数据。

HZK16字Curry的16×16中夏族民共和国字风华正茂共必要2五十七个点来显示,约等于说必要三十多个字节本领到达突显七个普通汉字的指标。

前边谈起叁个汉字占八个字节,这两个中前二个字节为该汉字的区号,后多少个字节为该字的位号。在那之中,每个区记录玖拾伍个汉字,位号为该字在该区中的地点。所以要找到“小编”在hzk16库中的地点就必需拿到它的区码和位码。(为了分化使用了区码和区号,其实是叁个事物,别被本身误导了)

笔者们精晓二个GB2312汉字是由五个字节编码的,范围为0xA1A1~0xFEFE。A1-A9为符号区,B0-F7为汉字区。每四个区有92个字符(注意:那只是编码的特许约束,不料定都有字型对应,比如符号区就有比超多编码空白区域卡塔尔(قطر‎。

区码:区号(汉字的第叁个字节)-0xa0 (因为汉字编码是从0xa0区最初的,所以文件最前面便是从0xa0区起头,要算出相对区码卡塔尔(قطر‎

下边以汉字"小编"为例,介绍怎么样在HZK16文件中找到它对应的叁拾八个字节的字样数据。后面说起壹此中华夏儿女民共和国字占八个字节,这两当中前一个字节为该汉字的区号,后三个字节为该字的位号。在那之中,各类区记录玖拾伍个汉字,位号为该字在该区中的地点。所以要找到"笔者"在hzk16库中的地点就务须获得它的区码和位码。

位码:位号(汉字的第三个字节)-0xa0

区码:汉字的先是个字节-0xA0(因为汉字编码是从0xA0区开始的, 所以文件最前头正是从0xA0区早先, 要算出绝对区码卡塔尔(قطر‎

如此大家就可以拿走汉字在HZK16中的相对偏移地点:

位码:汉字的其次个字节-0xA0

offset=(94*(区码-1)+(位码-1))*32

如此我们就能够赢得汉字在HZK16中的绝对偏移地方:

疏解:1、区码减1是因为数组是以0为发端而区号位号是以1为发端的

offset=(94*(区码-1)+(位码-1))*32

2、(94*(区号-1卡塔尔(قطر‎+位号-1卡塔尔(قطر‎是三个汉字字模占用的字节数

注解:

3、最后乘以32是因为汉字库文应从该地点起的32字节消息记录该字的字样音讯(前面提到一个汉字要有34个字节彰显)

区码减1是因为数组是以0为始发而区号位号是以1为起始的

 有了摇头地址就能够从HZK16中读取汉字编码了

(94*(区号-1卡塔尔+位号-1State of Qatar是三个中华夏族民共和国字字模占用的字节数

贯彻思路:

末尾乘以32是因为汉字库文应从该职分起的32字节消息记录该字的字样消息(后面提到叁此中中原人民共和国字要有三贰10个字节突显卡塔尔

  1. 打听HZK编码,精通一下合乎GB2312规范的汉语点阵字库文件HZK16;
  2. 下载中文GB2312的二进制点阵文件;
  3. 将HZK16.fnt文件归入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将原先装载nihongo.fnt的讲话替换到装载HZK16.fnt就能够;
  5. 改正bootpack.c文件,将事前分配的装载保加利亚共和国语字体的内部存储器扩展,载入字库的文件名;
  6. 在haribote/graphic.c中增加扶助汉字的代码,扩大二个函数用于显示汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测量检验程序。
  9. 留意:塞尔维亚语的编码是分为左半局地和右半部分,而大家选用的HZK16是分为上半部分和下半部分的。

本人画的图示:

此处其余的地点相比较弄,第5步将大小修改一下,作者的是nihongo = (unsigned char *) memman_alloc_4k(memman, 55*94*32);

所以,'我'在HZK16 16*16点阵字库的贮存的行列为:

第6步,要介意,HZK16是内外两有的,区别于罗马尼亚语的左右两局地的构造。

(生机勃勃行生龙活虎行地保存,共16行,每行2个字节, 共三11个字节卡塔尔国

代码如下:

04 80 0E A0 78 90 08 90 08 84 FF FE 08 80 08 90

0A 90 0C 60 18 40 68 A0 09 20 0A 14 28 14 10 0C

void putfont32(char *vram, int xsize, int x, int y, char c, char *font1, char *font2)
{
    int i,k,j,f;
    char *p, d ;
    j=0;
    p=vram+(y+j)*xsize+x;
    j++;
    //上半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font1[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
       /* for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    //下半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font2[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
        /*for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    return;
}

就如上面那样:

 

以下是自身要好写的亲自去做程序, 能够慈祥纠正成其它的多少格式.(异常粗略, 所以没写注释卡塔尔。

运作结果,大家在euc.txt中步向一些汉字。

示例源代码

澳门新普京 1

版本1

参照他事他说加以考查资料:

int main(void)

1. 30天操作系统协理汉语。

{

FILE* fphzk = NULL;

int i, j, k, offset;

int flag;

unsigned char buffer[32];

unsigned char word[3] = "我";

unsigned char key[8] = {

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

澳门新普京 ,};

fphzk = fopen("hzk16", "rb");

if(fphzk == NULL){

fprintf(stderr, "error hzk16n");

return 1;

}

offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;

fseek(fphzk, offset, SEEK_SET);

fread(buffer, 1, 32, fphzk);

for(k=0; k<32; k++){

新普京网站 ,printf("%02X ", buffer[k]);

}

for(k=0; k<16; k++){

for(j=0; j<2; j++){

for(i=0; i<8; i++){

flag = buffer[k*2+j]&key[i];

printf("%s", flag?"●":"○");

}

}

printf("n");

上一篇:[BlueZ] 1、Download install and use the BlueZ and hcitool on PI 3B+ 下一篇:值得收藏,windows常用命令