next up previous
Next: 使用 XIM Up: X Window 的 I18N 環境簡介 Previous: Xi18n 相關的檔案

XOM 與 FontSet 設定

為了要顯示多國語言的訊息, 我們必須要一一辨識字串中不同編碼的區域, 然後再各自以不同的字型去顯示才行。 在過去的一些支援中文顯示的程式中,應用程式就是自己花功夫 辨識一個字串裡那些 是英文 (ASCII) 字,那些則是 Big5 字,然後為這兩種文字分別開一個字型出來 顯示,這是非常繁複且不討好的工作,因此 X 提供了一系列以字型組 (FontSet) 為基礎的字串輸出函式來進行多國語言字串的顯示工作。 若使用 FontSet,程式本身完全不需要去理會這些細節,給定任意的 字串,不論裡頭是純 Big5 字元也好,是 ASCII 與 Big5 夾雜也好,都可以用 統一的方式來顯示字串,至於多種字元編碼的辨識與處理的工作,則交由底層的 Xlib 來處理。這就很像我們先前所討論的國際化語文的字元與字串處理原則一樣。如此, 從程式設計的角度來看,我們既不需要擔心要如何辨識字串中每一個字是什麼樣的 編碼方式,也不需要擔心各編碼分別需要用那一種字型來顯示。故這樣的程式就是 一個國際化、支援 Xi18n 的程式。 我們可以說,使用 FontSet 就是 Xi18n 在國際化的文字顯示上面的解決方案。

顧名思義,FontSet 就是一組字型的集合,我們在 XLC_LOCALE 裡面定義了組成該 locale 底下的 FontSet 所需用到的字型編碼種類, 當應用程式利用 Xlib 的函式呼叫要求使用 FontSet 時,Xlib 就會依照 locale 的設定以及 XLC_LOCALE 的內容去讀取並開啟適當編碼的字型來組成 FontSet。 由於我們在 XLC_LOCALE 裡面並未定義字型的名稱或大小等等資訊,故 X 將 這些與 UI (User Interface) 相關的問題留給應用程式自己去處理。因此一般的應 用程式都會有一些設定檔或選項要求您設定 FontSet, 而且對於不同的應用程式其 FontSet 設定的地方也都不盡相同,不過 設定所需的語法是差不多的:其實就是將該 FontSet 中所需的字型名稱,以逗號串 起來即可,像這樣:

"-*-16-*-iso8859-1,-*-16-*-big5-0"
以上就是我們的 zh_TW.Big5 locale 下所需的 FontSet。這裡我們見到, 如同前面的 XLC_LOCALE 的定義,我們分別需要以 iso8859-1 以及 big5-0 為結束的兩個字型來組成 (請注意在設定時要用小寫)。像這樣的字 型名稱,我們稱之為 ``字型的完整名稱''。這樣的字型名稱是很長的,因為每兩個 減號之間的欄位分別代表了這個字型的不同屬性,如字型的大小 (點數)、作者 是那個公司、它所屬的類別為何 ...等等。舉一個實際例子,例如很多 GNU/Linux 廣為使用的 twmoe 16 點的楷體字,其原本的字型完整名稱是
-twmoe-kai-medium-r-normal-16-160-75-75-c-160-big5-1
當我們在做 FontSet 的設定時,我們當然可以將每個字型的整個完整名稱都寫進去, 但另一個較方便的方式就是如同我們上述的設定方式,將某些欄位用一個 ``$*$'' 號 來代表,如此一來可以縮短整個 FontSet 的設定長度,二來當 Xlib 見到這樣的設定 時,它就會試圖去找出第一個符合這樣的欄位名稱的字型來使用。這對於使用者 而言是很方便的,因為通常在不同的系統中所安裝的字型不見得會一樣,但這對程式 本身而言並不重要,重要的是程式只需要一個 big5-0 的字型,一個 iso8859-1 的字型,而且二者都是 16 點的,故只需要如上指定 FontSet 即 可,Xlib 會自動找出符合的字型來組合使用。

也許眼尖的讀者已注意到了,前面所舉的 twmoe 字型的字型末尾名怎麼會是 big5-1 呢?不是應該 big5-0 嗎?沒有錯,那個 twmoe 字型是 不能用來設定我們的 FontSet 的。在這裡就要提到一個大家在設定字型時常面臨的問 題:我的系統明明已安裝了中文字型,但偏偏它的名字末尾不是 big5-0,怎麼 辦呢?解決的方式很容易,就是使用字型的「別名」。

也許應該要更深入來討論字型的問題了。傳統上,X Window 的字型是使用所謂的 PCF 的字型 (字型檔的附檔名是 .pcf),這其實就是點陣字型 (至於 TrueType 字型 我們先暫時不做討論),它們通常是放在系統的

/usr/X11R6/lib/X11/fonts/
目錄底下,不同目錄放不同類型的字型。在過去的習慣,我們的中文字型是放在該目 錄下的 chinese/ 目錄下的。一般在安裝新的中文字型時,我們就是將抓回的 字型 .pcf 檔放在那裡,然後在那個目錄中跑一下
mkfontdir
的指令,於是這個指令就會更新該目錄下的 fonts.dir 檔的內容。這時如果 您的 XFree86 的設定檔 XF86Config 中有包含這個字型目錄,則您只要重新 進入 X Window,系統就會抓到這些新裝入的字型。

我們來看看這個 fonts.dir 的內容。以我們的系統為例,已安裝了五個 twmoe 的字型,則它的內容如下:

5
kai15.pcf -twmoe-kai-medium-r-normal--15-150-75-75-c-150-big5-1
kai16.pcf -twmoe-kai-medium-r-normal--16-160-75-75-c-160-big5-1
kai18.pcf -twmoe-kai-medium-r-normal--18-180-75-75-c-180-big5-1
kai20.pcf -twmoe-kai-medium-r-normal--20-200-75-75-c-200-big5-1
kai24.pcf -twmoe-kai-medium-r-normal--24-240-75-75-c-240-big5-1
其中第一欄是字型檔名,第二欄是這些字型的完整字型名,而這些完整的字型名是 mkfontdir 程式在讀取這些字型檔時所抽出來的資訊,故不能任意更動。然 而,這些字型名不能拿來做 FontSet 的設定,因此,我們可以為這些字型取個別名。 方法是在相同的目錄下,編輯一個如下的檔案 (檔名為 fonts.alias):
-twmoe-kai-medium-r-normal-16-160-75-75-c-160-big5-0
-twmoe-kai-medium-r-normal-16-160-75-75-c-160-big5-1
請注意,這個檔案也是兩欄,也就是第一行與第二行是中間有個空隔接在一起的。 第一欄是這個字型的別名,第二欄是這個字型的完整名稱,而以上的設定就是將那 個 16 點的 twmoe 字型名稱取一個符合我們的 FontSet 設定所需的名稱, 如此就可以拿來使用。至於其他的字型,也可以比照這樣子來做設定。同樣的當您 完成設定後,必須重新進入 X Window。

當您以上的設定都完成後,您就可以用 xlsfonts 的指令來看看系統目前存 在 (可以使用) 的字型有那些,如此也可以檢查您的設定是否正確。

現在再回來我們 FontSet 設定的部分。也許讀者會問:既然所有的欄位都可以用 ``$*$'' 號來代表,那我們能否只這樣設定就好了呢?

"-*-iso8859-1,-*-big5-0"
我們認為,這樣設定當然可以,但不太好。原因是,有些字型是可以放大或縮小的,這 樣的字型其完整的字型名的點數欄位就是 0,例如:
-twmoe-kai-medium-r-normal-0-0-75-75-c-0-big5-0
然而,這種字型是不能拿來做 FontSet 設定的,因為無論如何我們都必須指定一種 點數大小才行。因此,如果您的 FontSet 設定是用 -*-big5-0 這樣的設定 的話,如果系統中剛好也存在這種可以放大或縮小的字型,則很可能 Xlib 就會挑 到這種字型 (因為依字型名順序排列它是排在前面),而導至設定失敗。

那麼,這些 FontSet 到底設定在那裡呢?不同的應用軟體設定的地方不同。以目 前常見的桌面環境 GNOME 為例,它是以 gtk 視窗函式庫為基礎的,則 FontSet 必須設在 gtk 的設定檔中,如此整個 GNOME 環境以及絕大部分的 gtk 應用程式的 FontSet 就全部設定完成了。gtk 的設定檔是放在 /etc/gtk 目錄下,依不同 的 locale 而有不同的設定檔。例如我們的 zh_TW.Big5 locale 的設定檔 為:

/etc/gtk/gtkrc.zh_TW.Big5
而其 FontSet 的設定即為 (舉例):
style "gtk-default-zh-tw" {
     fontset = "-*-helvetica-medium-r-normal--14-*-iso8859-1,\
                -*-medium-r-normal--14-*--big5-0"
}
class "GtkWidget" style "gtk-default-zh-tw"
至於其他的應用程式,其 FontSet 有可能是設在使用者的
$(HOME)/.Xdefaults
檔中、或該程式專屬的設定檔中、或由命令列直接指定 ...等,必須視該應用程式 的設計而定。然而,不論是設定在那,其設定的語法大致都是一樣的。

完成 FontSet 的設定後,原則上 Xi18n 的 XOM 的部分就沒有問題了。至於 XIM 的 部分則更為複雜。以下我們就先做一些簡單的介紹,讓讀者有些概念,未來有機會 我們會另文再做深入探討。


next up previous
Next: 使用 XIM Up: X Window 的 I18N 環境簡介 Previous: Xi18n 相關的檔案
Tung-Han Hsieh 2000-10-16