<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 陣漢字顯示

陣漢字顯示

作者: 時(shí)間:2008-11-28 來(lái)源: 收藏
 DOS下的

  你是否碰到過(guò)用啟動(dòng)盤(pán)啟動(dòng)系統后用DIR命令得到一串串莫名其妙的字符?有經(jīng)驗的朋友會(huì )告訴你:那是。?你不禁會(huì )問(wèn):怎么一個(gè)我一個(gè)也不認識。但那確確實(shí)實(shí)是漢字,如果你啟動(dòng)UCDOS或其他的漢字系統后,就會(huì )看到那是一個(gè)個(gè)熟悉的漢字。同樣是漢字,為什么前后會(huì )看到不同的結果?呵呵,其實(shí)在電腦硬件中,根本沒(méi)有漢字這個(gè)概念,也沒(méi)有英文的概念,這鐵玩意認識的概念只有——內碼。

本文引用地址:http://dyxdggzs.com/article/89888.htm

漢字的內碼

  點(diǎn)頭表示什么?是“對”、“YES”,偏偏有的地方表示的意義卻恰恰相反。一個(gè)動(dòng)作,有不同的詮釋?zhuān)灰粋€(gè)問(wèn)題,有不同的答案;而一個(gè)符號,卻有不同的意義,關(guān)鍵在于:你是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對于顯示英文操作,由于英文字母種類(lèi)很少,只需要8位(一字節)即可。而對于中文,常用卻有5000以上,于是我們的DOS前輩想了一個(gè)辦法,就是將ASCII表的高128個(gè)很少用到的數值以?xún)蓚€(gè)為一組來(lái)表示漢字,即漢字的內碼。而剩下的低128位則留給英文字符使用,即英文的內碼。不信,你可以用記事本寫(xiě)一C文件:

main()
{
    unsigned char *s,*e="ABcd",*c="你好";
    clrscr();
    printf("English char =");
    s=e;
    while(*s!=0) /*C的字符串以0為結束符*/
    {
        printf("%3d,",*s);
        s++;
    }
    printf("nChinease char=");
    s=c;
    while(*s!=0)
    {
        printf("%3d,",*s);
        s++;
    }
    getch();
}

再用TC輸入*.txt打開(kāi)運行,看見(jiàn)了沒(méi)有,那些數值即英文和漢字的各字節內碼。

漢字字模

  得到了漢字的內碼后,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來(lái)記載英文或漢字的形狀,如英文的'A'在字模中是這樣記載的:

而中文的“你”在字模中卻是這樣記載的:


  在硬件系統內,英文的字模信息一般固化在ROM里,即使在沒(méi)有進(jìn)入系統的CMOS里,也可以讓你看到英文字符。而在DOS下,中文的字模信息一般記錄在漢字庫文件HZK16里。

漢字庫文件

  了解字母和漢字是按字模位信息顯示的原理后,那如何得到漢字的字模信息呢?難道要我們自己去做?NO。DOS前輩們經(jīng)過(guò)艱辛的努力,將制作好的字模放到了一個(gè)個(gè)標準的庫中以免去后輩的麻煩,這就是字庫文件。一般我們使用16*16的宋體字庫,所謂16*16,是每一個(gè)漢字在縱、橫各16點(diǎn)的區域內顯示的。不過(guò)后來(lái)又有了HZK12、HZK24,HZK32和HZK48字庫及黑體、楷體和隸書(shū)字庫。雖然漢字庫種類(lèi)繁多,但都是按照區位的順序排列的。前一個(gè)字節為該漢字的區號,后一個(gè)字節為該字的位號。每一個(gè)區記錄94個(gè)漢字,位號則為該字在該區中的位置。因此,漢字在漢字庫中的具體位置計算公式為:94*(區號-1)+位號-1。減1是因為數組是以0為開(kāi)始而區號位號是以1為開(kāi)始的。這僅為以漢字為單位該漢字在漢字庫中的位置,那么,如何得到以字節為單位得到該漢字在漢字庫中的位置呢?只需乘上一個(gè)漢字字模占用的字節數即可,即:(94*(區號-1)+位號-1)*一個(gè)漢字字模占用字節數,而按每種漢字庫的漢字大小不同又會(huì )得到不同的結果。以16*16點(diǎn)陣字庫為例,計算公式則為:(94*(區號-1)+(位號-1))*32。漢字庫文該從該位置起的32字節信息即記錄了該字的字模信息。


漢字庫文件

  了解點(diǎn)陣漢字及漢字庫的構成原理后,顯示漢字就變得簡(jiǎn)單。以16*16點(diǎn)陣字庫為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字庫文件讀入一2*16數組再用for循環(huán)一位位地顯示。以使用VGAHI模式顯示“我”字為例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{
    int i=VGA,j=VGAHI,k;
    unsigned char mat[16][2],chinease[3]="我";
    FILE *HZK;
    if((HZK=fopen("hzk16","rb"))==NULL)
        exit(0);
    initgraph(&i,&j,"");
    i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區碼與位碼*/
    fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
    fread(mat,32,1,HZK);

    for(j=0;j<16;j++)
        for(i=0;i<2;i++)
            for(k=0;k<8;k++)
                if(mat[j][i]&(0x80>>k)) /*測試為1的位則顯示*/
                    putpixel(i*8+k,j,WHITE);

    getch();
    closegraph();
    fclose(HZK);
}
怎么樣?只要掌握了正確的方法,顯示漢字并不復雜。

打印字庫文件和HZK12

  如果你有UCDOS的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),你還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點(diǎn)陣字庫,每字模占用3*24字節。如果你按照HZK16的顯示方法的話(huà),你會(huì )看到......呵呵,字被放倒了。這是因為該類(lèi)字庫與一般的漢字庫不同,這類(lèi)大字模漢字庫是專(zhuān)供打印的打印字庫,為了打印的方便將字模都放倒了,你使用時(shí),只要將字模的位信息縱橫轉置顯示即可。例如你如果定義為mat[24][3]則應該這樣輸出:
    for(i=0;i<24;i++)
        for(j=0;j<24;j++)
            if((0x80>>i%8)&mat[j][i/8]) /*轉置顯示*/
                putpixel(j+x,y+i,color);
  還有一類(lèi)字庫HZK12,雖然屬于標準字庫類(lèi)型,但如果你將它的字模當作12*12位計算的話(huà),根本無(wú)法正常顯示漢字。因為字庫設計者為了使用的方便,字摸每行的位數均補齊為8的整數倍,于是實(shí)際該字庫的位長(cháng)度是16*12,雖然每行都多出了4位,但這4位都是0(不顯示),并不影響顯示效果。



關(guān)鍵詞: 點(diǎn)陣 漢字

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>