什么是點(diǎn)陣漢字 發(fā)表時(shí)間:2007-3-17 14:30:27 天氣狀況:
心情指數:
瀏覽次數:116所謂一個(gè)字的點(diǎn)陣. 其實(shí)就是指這個(gè)漢字用多少個(gè)象素點(diǎn)來(lái)描述. 每個(gè)象素點(diǎn)顯示為什么顏色, 通常情況下, HZK16采用的是16*16點(diǎn)陣, 即256個(gè)象素點(diǎn)描述一個(gè)漢字.
這些點(diǎn)的顏色分為兩種, 一種是前景色, 一種是顯示為背景色.
那么,關(guān)于那些點(diǎn)顯示為前景色, 那些點(diǎn)顯示為背景色, 是如何得知的呢??
可以這樣來(lái)考慮, 你在紙上比較正正方方的寫(xiě)一個(gè)規則的楷字, 然后在這個(gè)字的從上到下,左到右, 分別畫(huà)十七條直線(xiàn), 那么這
個(gè)字就被放置于一個(gè)16*16的方格之內, 這樣我們就可以很明顯的看出, 16*16的方格內的具體哪些點(diǎn)有筆劃經(jīng)過(guò), 有筆劃經(jīng)過(guò)與沒(méi)筆化經(jīng)過(guò)的即就是應該被分別填充上前景色與背景色的點(diǎn).
現在,找到了一個(gè)漢字的點(diǎn)陣, 那么還須要用數據來(lái)記錄點(diǎn)陣的信息, 通常情況下, 我們會(huì )用32個(gè)字節來(lái)表示16*16點(diǎn)陣的漢字,
即每一行用二個(gè)字節來(lái)記錄十六個(gè)象素點(diǎn)的色色彩情況, 0表示背景色, 1表示前景色.16行其須要32個(gè)字節.點(diǎn)陣漢字的原理同時(shí)也決定了它的缺點(diǎn), 他不具務(wù)放大特性, 因為它的顯示是基于被定死的點(diǎn)陣, 放大后,會(huì )產(chǎn)生明顯的鋸齒,非常的難看, 當然, 可以進(jìn)行一些光滑處理, 但基本上沒(méi)有多在的改觀(guān).但點(diǎn)陣漢字簡(jiǎn)易, 對于復雜漢字,它比矢量顯示漢字法更快帶.矢量顯示是基于記錄漢字的筆化的. 對于簡(jiǎn)單的漢字它比較占優(yōu)勢, 容易放大處理. 但對于復雜的漢字, 表示起來(lái),則筆化太多..復雜.
二. 關(guān)于字庫的建立及其原理.
現在講完了漢字點(diǎn)陣. 也說(shuō)了一個(gè)漢字點(diǎn)陣的存放方式, 但具體的點(diǎn)陣如何存放, 讀者也應該了解.
通常情況下, 一般的DOS下的程序都會(huì )提供一個(gè)漢字庫, 這樣在脫離漢字平臺(如UCDO)的支持下也可以進(jìn)行漢字顯示,但是這樣會(huì )存一個(gè)問(wèn)題, 就是如果每個(gè)DOS下的程序員都這么做的話(huà), 就會(huì )造成一定的磁盤(pán)空間浪費.所以有的DOS下的程序,針對自己所需要的漢字, 就會(huì )定制自己的小型字庫, 那么字庫的制作到底應該如何進(jìn)行呢?下面我們將就這個(gè)問(wèn)題進(jìn)行一些基本的討論.
眾所周知,一個(gè)ASCII字符占一個(gè)字節,它的數值從0到255,那么漢字字符將如何與ASCII字符區別開(kāi)來(lái)呢?實(shí)際上,仔細觀(guān)察ASCII字符表,從第161(即0xa1)個(gè)字符開(kāi)始,后面的字符并不經(jīng)常為E文所使用。充分利用這一特性,將161-255之間的數值空間作為漢字的標識碼。既然255-161 =94不能滿(mǎn)足漢字容量的要求,就將每?jì)蓚€(gè)字符并在一塊(即一個(gè)漢字占兩個(gè)字節),顯然,94* 94 =8836基本上已經(jīng)滿(mǎn)足了常用漢字個(gè)數的要求。
從以上的討論可以知道, 用二個(gè)字節來(lái)表示一個(gè)漢字, 其原因就是上面說(shuō)的, 這個(gè)就是我們常說(shuō)的漢字機內碼, 一個(gè)漢字的機內碼是由值都大于0xa1的值組成的.
說(shuō)完機內碼, 有的朋友可能就會(huì )問(wèn)題, 機內碼與建立漢字字庫有什么關(guān)系呢??
我們常見(jiàn)的標準的漢字字庫HZX16(點(diǎn)陣16*16),HZK24(24*24)兩種.由上面的討論我們得知,一個(gè)漢字點(diǎn)陣須要256個(gè)象素點(diǎn)陣來(lái)表示, 我們采用一個(gè)字節的8位來(lái)表示八個(gè)象素, 其須32個(gè)字節;字庫中要存放的是所有常用的漢字的二進(jìn)制點(diǎn)陣數據, 它的存放是有序的, 下面我們說(shuō)一下這個(gè)順序:
首先.對于"我"字來(lái)說(shuō), 它的機內碼是0xce,0xd2; 機內碼每個(gè)字節均從0xa1開(kāi)始, 那么我們已經(jīng)采用的建立點(diǎn)陣字在庫中的索引方法是:
將整個(gè)字庫里面的漢字是94*94的二維數組, 要找任意一個(gè)漢字的點(diǎn)陣, 就須要知道這個(gè)漢字在這個(gè)二維數組當中的X維與Y維.
x維 = (機內碼字節1-0xa1) & 0x7f;
y維 = (機內碼字節2-0xa1) & 0x7f;
求漢字在X,Y維后, 那么按照每個(gè)漢字占用32個(gè)字節, 則可以得出漢字相對于字庫頭的偏移是 offset = (x*94 + y)*32;
其實(shí),X與Y就是漢字的區位碼, 漢字的區位碼是從0-94的. 但實(shí)際上只用了16-87..
其中一級漢字在16-55..二級漢字在56-87.是按照一定的規則來(lái)確定區位碼的.對于一級漢字.是按拼音首字母級筆劃.二級漢字是按部首來(lái)的.我特意生了一個(gè)漢字的區痊碼,機內碼.在字庫中偏移的文件..大家可以下載來(lái)看一下. 可以知道:
啊-------------區位碼(x = 15, y = 0); offset=b040; 機內碼:(0xb0,0xa1);
所以漢字的區內碼,機內碼,偏移的信息,請下載這個(gè)文件查看.
http://www.macro-tax.com/home/ucgui/HZK_info.rar其中,區位碼(x=0-14)與(88-94)都是沒(méi)有對應漢字的.字庫中實(shí)際的對應漢字點(diǎn)陣字數為94*72=6768個(gè)漢字.
實(shí)際上, 一個(gè)字庫中有前16*32個(gè)字節沒(méi)有表示具體的漢字的, 在字庫里被用來(lái)表示什么東西沒(méi)有什么具體的要求, 如果說(shuō)你自己要做一個(gè)字庫.那么這一段你可以自己發(fā)揮, 填充為一個(gè)中文的符號,笑臉,特別文字什么的.這些沒(méi)有具體的要求.
同理.對于(88---94)*32, 你也可以自己發(fā)揮. 然后告知別人如何使用,因為這個(gè)沒(méi)有標準, 所以一定要有特別的說(shuō)明,別人才可可以使用.
在一般的HZK16當中, 最前16*32個(gè)節有表示兩個(gè)大小的"A"及兩個(gè)感嘆號, 一個(gè)在圓內的"帥"字..大家可以仔細看一下,其它幾個(gè)沒(méi)作特別使用.