next up previous
Next: XOM 與 FontSet 設定 Up: X Window 的 I18N 環境簡介 Previous: 基本架構

Xi18n 相關的檔案

在 libc 中,我們用所謂的「區域化資料庫 (即 locale database)」來定義跟語系、 編碼系統相關的資料設定,而在 X Window 這邊也有類似的設計,就 稱之為 X-locale。一般 XFree86 系統的 X-locale 資料檔案是擺在這個目錄底下的:

/usr/X11R6/lib/X11/locale/
在這個目錄下,我們可以看到就和 libc 一樣,每個 locale 都有一個目錄,各自放了 X-locale 的資料,這個資料檔的名字照慣例是取作 XLC_LOCALE 的, 裡面包含了跟該區域編碼相關的設定, 而檔案裡面以 # 字號開頭的是註解。 如前所述,Xi18n 有 XIM 與 XOM 兩個層面,而這兩個層面就反 應在 XLC_LOCALE 的內容中, 以我們繁體中文 XLC_LOCALE 的內容為例:
XLC_FONTSET
#        fs0 class (7 bit ASCII)
fs0     {
        charset {
                name    ISO8859-1:GL
        }
        font    {
                primary ISO8859-1:GL
                vertical_rotate all
        }
}
#        fs1 class
fs1     {
        charset {
                name    BIG5-0:GLGR
        }
        font    {
                primary BIG5-0:GLGR
                substitute BIG5-0:GLGR
        }
}
END XLC_FONTSET
以上這一段是定義顯示該 locale 文字所需用到的字型組,稱之為 FontSet。 在顯示多國語言文字的時候,單一一種編碼的字型是不夠用的, 常常需要兩種以上的字型才行,例如繁體中文的顯示就牽涉到以 BIG5 編碼的 中文字型、還有以 ISO8859-1 編碼的英文字型, 所以我們必須用一套字型組來作多國語言文字的顯示工作。上面 XLC_FONTSET 這個區塊就是用來指定該 locale 底下字串顯示時會用到的字型組編碼的, 以上面的設定來看,在繁體中文顯示時要用到兩種不同編碼的字型,一為 ISO8859-1 編碼的英文字型, 其字型名稱會以 ISO8859-1 結尾;另外一個就是 Big5 中文字型囉,其字型名稱是以 BIG-0 結束的。了解這一點很重要,因為往後我們要讓支援 Xi18n 的應用程式正確顯示中 文的話,就必須根據上述的 FontSet 定義來做字型設定才行。

接下來這一段定義了我們的 locale 所使用的字集在 X Window 系統中的處理方式:

XLC_XLOCALE

encoding_name           zh_TW.Big5
mb_cur_max              2
state_depend_encoding   False
wc_encoding_mask        \x00008000
wc_shift_bits           8
use_stdc_env            True
force_convert_to_mb     True

#       cs0 class
cs0     {
        side            GL:Default
        length          1
        wc_encoding     \x00000000
        ct_encoding     ISO8859-1:GL
}
#       cs1 class
cs1     {
        side            none
        length          2
        byte1           \xa1,\xf9
        byte2           \x40,\x7e;\xa1,\xfe
        wc_encoding     \x00008000
        ct_encoding     BIG5-0:GLGR:\x1b\x25\x2f\x32 ....
        mb_conversion   [\xa140,\xf9fe]->\x2140
        ct_conversion   [\x2140,\x79fe]->\xa140
}
END XLC_XLOCALE
簡單來說,在 zh_TW.Big5 locale 中所需的字元有兩種,一種就是單位元 的 ASCII 字,也就是上頭 cs0 小節中定義的部分,這些字元必須用 ISO8859-1 的字型來顯示;另一種就是雙位元字,也就是 cs1 小節 中定義的部分,而這些字元必須用 BIG5-0 的字型來顯示。

除了 XLC_LOCALE 檔案以外,/usr/X11R6/lib/X11/locales/ 目錄下還有兩個檔案用來定義可用的  X-locale 名稱與位置:

  1. locale.dir: 這個檔案列出每個 locale 的 X-locale 資料檔的位置,與 其實際的 locale 名稱。以我們的 zh_TW.Big5 locale 為例,其內容 即為:
    zh_TW.Big5/XLC_LOCALE zh_TW.Big5
    意思是,X-locale 的檔名為 zh_TW.Big5/XLC_LOCALE,而對應到的 locale 名稱即為 zh_TW.Big5

  2. locale.alias: 這個檔案列出每個 locale 可能的「別名」。檔案的格 式也是兩欄,左邊那欄是別名,而右邊那欄則為真正的 locale 名稱。

如果要在 X Window 系統中加入一個新的 locale 支援,我們必須要準備好一份 X-locale 的資料 (即 XLC_LOCALE 檔) 放在此一目錄下,同時要修改 locale.dir 檔的內容,加入該 locale 的名稱與 X-locale 資料檔的位置即 可。

對於我們的 zh_TW.Big5 locale 而言,情況稍微複雜了些。在早期的 XFree86-3.3.X 系統中除了缺我們的 XLC_LOCALE 檔以外,同時底層的 Xlib 在處理 Big5 編碼時也有問題,故還得同時修正 Xlib 的原始碼,並重新編譯才行, 可以說麻煩不小。直到 XFree86-3.3.6 以後,這些問題才完全解決,因此我們就不 再需要做額外的修正了。因此,在此我們建議如果您希望您的 XFree86 系統可以支 援我們的 zh_TW.Big5 locale 的話,就直接升級到 XFree86-3.3.6 即可。

至於新版的 XFree86-4.0.X,則是缺了 zh_TW.Big5 的 XLC_LOCALE 檔,但其 Xlib 不會有處理 Big5 上的問題。而且,該 XLC_LOCALE 的格式也與過去的版本一樣,放置的位置也沒有改變。 所以要讓 XFree86-4.0.x 的系統支援 zh_TW.Big5 locale 的解決方式很簡單, 只需將目前 XFree86-3.3.6 裡面的那份 XLC_LOCALE 拷貝過去,並記得修改 locale.dir 的內容加入一行 ``zh_TW.Big5/XLC_LOCALE zh_TW.Big5'' 就好囉。



Tung-Han Hsieh 2000-10-16