- 相關推薦
漢字的動態編碼與顯示方案
摘要:綜合幾種常用單片機漢字顯示方案,提出一種基于PC機預處理的漢字動態編碼和動態字庫的顯示方法,較好地解決了存儲空間、顯示速度、軟件開發維護幾方面的相互矛盾;具有平臺化的優點,同時,給出針對MCS51優化的匯編顯示例程。因為漢字本身的特點,顯示漢字始終是計算機在我國應用普及的一個障礙。最初,為了能在PC機上顯示、處理漢字,國人發明了一種硬件設備"漢卡",后來各種各樣的采用純軟件技術的中文DOS逐漸成熟,其中、西文軟件的運行速度和性能還是有明顯的差距。最終在軟件進入支持UNICODE、真正實現國際化的WIN95以后,硬件跨入"奔騰"時代,才實現了漢字與西文的統一顯示,但是這一切是以硬件資源的飛速發展為前提的。以國際GB2312為例,一、二級漢字庫共收錄了6000多個漢字,每個字按16×16點陣計算,字模需要占用32字節的存儲空間,整個字庫的規模在200k字節以上,高點陣(24點陣以上)和矢量字庫以及Windows用的TrueType字體的字庫規模都是幾兆字節大小,這在早期的386時代是難以想象的。單片機因為使用靈活、結構簡單、體積小、成本低而在工業和生活中得到廣泛應用,也正是因此,它的硬件資源很有 限,尋址和計算機能力都遠低于PC機,顯示漢字更受限制。人們不滿足單片機系統采用LED數碼管的簡單顯示,根據單片機的特點,開發出了很多種漢字顯示方法。
1 幾種常用單片機顯示漢字方法
(1)采用標準字[1]
這種方法仿器中文DOS的辦法,將一個標準的漢字庫裝入ROM存儲器,再根據漢字的機內碼在字庫中尋址,找到對應的字模,提取后送到顯示器顯示。因為采用了和PC機相同的編碼(機內碼),軟件的開發和維護非常簡單,基本上與寫PC機軟件差不多。而對單片機系統自身的要求則相對高多了,16×16點陣的字庫需要256K字節,但是一般8位單片機的尋址能力只有64K字節,要進行存儲器擴充,除增加很大一部分硬件成本外,還因為要進行存儲器分頁管理、地址切換,顯示速度明顯受影響,而且只能顯示一種點陣字體。
(2)直接固化顯示字模[2]
將要顯示的語句中全部漢字的字模數據依次提取出來,順序存放在存儲器中,當顯示時,直接取出字模數據送至顯示器即可。這種方法占用空間少,程序實現簡單,顯示速度快;但是字模數據的提取和存儲安排是一件委有繁瑣的事件,要想大量顯示漢字或進行程序修改幾乎是不可能的,軟件的可維護性很差。
(3)建立帶索引的小字庫[3]
將全部要顯示的漢字統一建成一個小字庫,字庫分為2部分:索引素和字模表。索引表由若干定長記錄組成,記錄的內容為:漢字機內碼、地址碼、識別碼。其中地址碼是該漢字字模在字模表中的位置,識別碼標志該漢字的點陣形式或字體等。字模表中按素引存放漢字字模。顯示漢字時先根據待顯漢字的機內碼在索引表中尋找,找到對應索引記錄后,讀出地址碼和識別碼,再根據此從字模表中讀出字模,送顯即可。這種方法可根據實際使用對字庫進行裁剪,硬件開銷較小,但是要進行復雜的查詢運算,字多了平均尋找時間就會變長,效率降低。
2 漢字動態編碼
綜上所述,我們發現:在方法1中,程序員工作量最少,但單片要機的軟、硬件開銷最大;方法2中,單片機的開銷較少,但是編寫和維護軟件極為困難;方法3,介于二者之間。顯然,存儲空間、顯示速度、軟件開發維護件間存在著矛盾。受各種PC機模擬軟件的啟發,我們提出一種基于PC機預處理的漢字顯示方法--漢字動態編碼,在實際應用中較好地解決了這一問題。其基本原理如下:建立一種新的編碼機制,這個漢字編碼是動態的;一個編碼不與某個漢字具體相聯系,而僅代表某個漢字在字庫中的位置(這個位置也是動態的);用該碼代替程序里字符串(C語言)或數據段(匯編語言)內漢字的機內碼,單處機顯示程序可根據這個新的編碼直接在專門建立的動態小字庫中找到字模,不用進行復雜的尋址、查找等運算,如圖1所示。
實現漢字動態編碼的過程就是先進行漢字識別,然后建立編碼字典、提取字模、建立動態字庫、改寫機內碼。首先掃描一遍程序文件,識別其中的漢字,將它們按出現先后順序或機內碼的大小排序,重復出現的剔除,建立了一個編碼字典;根據漢字在編碼字典的位置(序號),可以對漢字按區碼、位碼進行編碼,也可以采用其它的方法編碼,總之序號與它的動態編碼存在一一對應關系;根據字典中每個漢字的機內碼依次從PC機的漢字點陣字庫中提取字模,順序存儲,建立一個小規模的動態字庫,這樣每個漢字的字模在字庫中的位置就與其在編碼字典中的序號、動態編碼一一對應了。最后,再掃描一遍程序文件,按照編碼字典將每個漢字的機內碼改寫為對應的動態編碼。因為程序文件中的漢字隨時會增減,編碼隨之而變,字庫的大小也隨時在變。所以稱之為動態編碼和動態字庫。
考慮一般應用場合,1000個左右的漢字即可滿足要求,按照漢字動態編碼方法所需的字庫僅為32K字節大小,只需要1片27256即可,幾乎不用增加什么硬件。這樣,字庫的大小可由漢字的多少控制,程序的編寫和維護可以沿用中文系統下的習慣,僅需要編寫好的單片機程序用PC機進行一次預處理,程序員從繁雜的漢字處理工作中解放出來,有效地降低了軟件和硬件開發成本。
3 漢字動態編碼的具體實現
實現漢字動態編碼的關鍵是建立編碼字典和改寫機內碼。下面以是顯示1行漢字"天上有個太陽,水中有個月亮"為例,說明動態編碼的實現過程。
(1)漢字識別
漢字在PC機內的存儲和處理是用機內碼來實現的。每個漢字的機內碼是唯一的,由2個字節組成,分區碼和位碼,為了和西文的ASCII碼有區別,漢字機內碼的區碼和位碼的取值都大于0A0H。我們要處理的源程序文件都是文本文件,存儲的都是西文字符、控制符的ASCII碼和中文字符的機內碼,當掃描到文件中大于0A0H的字節內容時,即可判斷該字節是漢字機內碼的1個字節,而且肯定是成對出現,第1個字節是區別,第2個字節是位碼,都大于0A0H,否則出錯。
在C和匯編程序中表示字符的方式有所不同,但最終字符在文件中的存儲格式是一樣的。顯示上面那行漢字,用C語言可以表示為:
char OneSent[]="天上有個太陽,水中有個月亮";
printfhz(OneSent);/*printfh
【漢字的動態編碼與顯示方案】相關文章:
動態哈夫曼編碼的改進03-18
單片機系統中的漢字顯示03-18
計算機畢業論文-動態哈夫曼編碼的改進03-06
Tunstall編碼與自適應編碼算法03-07
不依賴高點陣字庫實現屏幕漢字顯示03-03
VGA顯示與TV顯示的區別及轉換03-19
Video Object編碼技術01-07
視音頻素材的編碼轉換03-19
自適應算術編碼的FPGA實現03-18