在 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 名稱與位置:
zh_TW.Big5/XLC_LOCALE zh_TW.Big5意思是,X-locale 的檔名為 zh_TW.Big5/XLC_LOCALE,而對應到的 locale 名稱即為 zh_TW.Big5。
如果要在 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'' 就好囉。