星期四, 9月 08, 2005

Perl + GD 顯示中文字



GD 顯示中文字型,我其實是脫褲子放屁。
GD可以直接顯示中文字型(看起來是沒問題,不過我沒試過),對於問題我喜歡以自己的方式解決。
1. 判斷中英文
2. 找出字型碼
3. 對應到圖檔

我做的其實不過就是倚天中文年代在DOS下顯示中文,說穿了沒什麼。









首先要了解 Big5 碼的編碼
Big5 分 HIGH BYTE 和 LOW BYTE 兩個部份。
High Byte 的範圍 是 A1-F9
Low Byte 的範圍 是 40-7E A1-FE
詳細的規則


如此要分辨中英文字變的很簡單
if ($big5b !~ /[\xA1-\xF9][\x40-\x7E\xA1-\xFE]/) {
# 英文 }


再來要讀取中文字型依此演算

1. (HIGH BYTE-164)乘157
2. LOW BYTE 若小於 127 ,則減 64,若大於或等於 127 則減 98
3. 將1和2的結果相加,即得到此中文字的排列序號 有了排列序號 再乘 30 就可以得知中文字型的位置再往下讀取 30 Byte 就是該中文字的字型。


$highb = ($highb-164)*157;
if ($lowb < lowb =" $lowb-64;" lowb =" $lowb-98;" pos =" ($highb+$lowb)*30;">

Q: 為什麼要乘 30?
A: 每個字 佔了 30 Byte,所以有了位置還要乘 30。

有了字型再來就是 「對應到圖檔」讀出來的 30 Byte,在每個 Byte 有 8 個 Bit,當該 Bit 是1 代表那點是亮點,0 代表 不亮。 以下引述別人的解釋


中文結構我們討論 16X15 的字型,16代表16點(16BIT),15代表15列,如下:


上面就是一個中文字的構造,每八BIT代表一BYTE,所以一個中文需三十個BYTE來畫出,比方你要造一個[中]字,你只要讓上圖的點,該亮的地方讓它亮起來,看起來像個字就可以了
最後 開張圖 用 GD 在圖上把「點」畫出來


如果判斷是英文,會因為字型的不同造成圖片顯示的亂七八糟。所以我用ASCFONT.15 來做顯示,同樣的放棄 GD 字型。既然是英文字排列更輕鬆,依 ASCII 碼排序,每個字元 15Byte ,顯示的動作是一樣的。


詳細的 Code 就不公開了,相信您一定可以寫比我更棒更好的 Code。