1. 程式人生 > >16/24點陣字型檔(經典)

16/24點陣字型檔(經典)

      最近重新找了一下C語言的資料,深深的被c語言的底層操作特性迷戀~。在這方面,最經典的一本書莫過於清華大學出版社的《C高階實用程式設計》(王士元),在C語言高階應用領域裡這是我見過的寫的最好的一本書,非常可惜的這本書現在已經絕版了(可能是因為技術發展和更新的太快),在書店裡網上都無法買到了。記得本科時期經常借同學的這本書來讀,愛不釋手,裡面的知識極具魅力,即使今天看起來仍讓我覺得不是過時,而是回味無窮。這裡提到的字型檔檔案和作業系統都已經屬於古董級別了,現在可能也很難找到了。。。。這種應用在現在時代也很少有人研究了,但我想在微控制器等嵌入式系統的點陣式漢字顯示屏中仍然在使用。
      在這裡我參考了一些資料中的用C語言顯示漢字字型檔的資料。在計算機發展的早期,為了支援顯示漢字,國內發明了相應的2個位元組表示的漢字國標(GB)碼,根據這個編碼規則,漢字分為94個區,每區94個漢字,漢字在其所在區內的位置用位號表示,兩個位元組分別表示區號和位號,為了區分ASCII碼,每個位元組的首位都被置為1。在網路傳輸時還有特定的區分方法,這裡不細述這些細節了。在國際編碼中,中國漢字被分配到第16區(起始區號0x0F)。為了顯示漢字,需要漢字字形檔案(字型檔)的支援。在DOS時代,出現了USDOS系統,有HZK16(16*16字形),HZK24(24*24字形)等字型檔檔案,本質上一個漢字字元是一個二值影象(即bpp=1),所以本質上是一種圖形字型(非向量的),例如HZK16,每個字是16*16畫素,每個畫素佔1位(1/8byte),因此每個漢字在檔案中佔據了16*16/8=32 bytes/漢字。HZK24每個漢字佔據24*24/8=72 bytes/漢字。由於採用了這些約定,所以檔案中沒有任何檔案頭等附加描述資訊,而全部是緊密排列的畫素字形點陣,檔案從第一個位元組開始第一個字元一直到最後一個字元結束,檔案也沒有後綴名。字形在檔案中是緊密排列的,但是需要注意的2點重要問題是:
       (1)字形掃描順序:
        HZK16是按行掃描,而HZK24是按列掃描。
        所以假設一個字形讀取到一個byte[]。則位元組的分佈分為按行掃描和按列掃描。例如在HZK16中是按行一行一行掃描,即前byte[0],byte[1]是第一行,接著2個byte是第二行。。。而HZK24為了使使用它的印表機輸出,採用的是按列掃描,因為印表機有一個縱向的24針,每一次可以逐列的列印一行漢字,因此為了配合印表機,HZK24採用了按列掃描。如下圖所示:(圖中的數字表示的該位元組在byte[]中的索引。)
          

          下面這張圖顯示的是24*24畫素的按列掃描的漢字字元,是如何用一個BYTE[]陣列來描述的:圖中用彩色填充的方式標示出了BYTE[0],BYTE[1],BYTE[2]:
           
        (2)字形在字型檔檔案中的定位:
         請注意的是,在HZK16和HZK24中定位是不同的。這是由於漢字在檔案中的起始區不同。HZK16的漢字起始區在第16個分割槽,而HZK24則直接從第一個分割槽開始。HZK16的前15個分割槽裡面儲存了一些特殊符號,字母等(見後面的截圖)。因此漢字所在的分割槽是從15號分割槽開始的,而HZK24不包含前面的特殊字元,第一個區就是漢字區“啊”,從0號分割槽開始。另一點需要注意的是,兩者的【bytes/漢字】數值不同。用offset表示從檔案頭開始計算的檔案偏移地址,code[2]表示漢子碼。
          則code是用內碼錶示的,如漢字表中的第一個漢字“啊”的內碼是{0xb0,0xa1};從漢字碼的第一個位元組獲取區號,從第二個位元組獲取位號。將他們減去0xA1就轉換為我們需要的區號和位號。即換算成區號是{0x0f,0x00},表示“啊”字位於第15區,位號是0。
          對於HZK16來說:94是每個區的漢字數。
          unsigned long offset=( (code[0]-0xA1)
*94 + (code[1]-0xA1) )*32L;    //32是每個漢字佔據的位元組數
          對於HZK24來說:
          unsigned long offset=( (code[0]-0xA1-15) *94 + (code[1]-0xA1) )*72L;//72是每個漢字佔據的位元組數
          注意上面的HZK24中,由於第一個分割槽就是漢字區,所以區號被減去了0x0F。
          
          這樣,我們看顯示一個字元的程式碼:(以下程式碼來自於《C高階應用程式設計》一書。)