一、前言: 最近這個話題大家吵得有點厲害,大家都希望 Linux 能在中文方面有所進步,各家有各家的說法,莫衷一是。由於我最近常與 CLE 的 group 有聯系,同時也正在寫一些與 中文相關的程式,因此我大略說一下「我們正在做什麽」,讓大家參考。 我希望大家能將這篇文章當做技術性文章來讀,不要再有情緒化的批評,必境我們要的 是 solution, 情緒化的批評對我們實在沒有幫助。除此之外,我的觀點可能有錯,也 可能過份樂觀,也歡迎大家能就技術方面給予我指教。 二、 I18N 與 locale: 要將 Linux 中文化,朝著標准走才是長遠之計。各位如果有見過近代商業版的 UNIX 就會曉得,它們「中文化」之徹底,令人驚歎,諸如中文選單、中文訊息 .... 您能想 像得到,或說只能在 Win95/98/NT OS/2 .... 等上頭才見得到的 中文環境,它們都 有。然而,它們的中文並不是像目前 Linux 上常見到的那樣,由一堆程式七拼八湊出 來的,它們全部都是遵循一個標准: I18N 。 I18N 是 InternationalizatioN (國際化) 的縮寫,第一個字 I 與最後一個字 N 之間 有 18 的字母,故名。 I18N 並不是只有表面上將 X Window 「國際化」而已,它是□ 基在最底層的 libc 上。 libc 必須要有 locale 的支援,才能向 I18N 起步。 什麽是 locale? 簡單說就是一組「地區語言」的資訊。它包括了 (詳見 man setlocale): LC_CTYPE: 字元定義 LC_MESSAGES: 訊息顯示 LC_TIME: 時間顯示格式 LC_NUMERIC: 數字顯示格式 LC_MONETARY: 貨幣顯示格式 LC_COLLATE: 字母順序與字串比較 其中,與一般使用者最有關系的,是 LC_CTYPE 與 LC_MESSAGES 。 LC_CTYPE 直接關 系到某些字元或內碼在目前的 locale 下是否可印? 要如何轉換? 對應到那一個字? .... 等等。 LC_MESSAGES 則關系到軟體的訊息輸出是什麽樣的語文。真正完整的 locale 支援,是當我們在 shell prompt 下,直接設好環境變數,則我們馬上就能切 換到那個語文了。例如: bash: eXPort LC_CTYPE=zh_TW.Big5 有了 locale 的「協定」,使得任何地區的語文,只要在加入適當的 locale data 之後, libc 就能正確地處理它了,而我們的「中文」當然也不例外。由於前人與 CLE group 的努力,目前我們已有自己的 locale data 了。有安裝 CLE 的朋友可以到 /usr/share/locale 下看看, zh_TW.Big5 就是我們的 locale data, 雖然還不夠完整,但已能 work。 目前 Linux 對於 locale 的支援如何? 可以大概地說,西方語系差不多沒問題了,但 東方語系還有不少問題。如果您的 Linux 系統是用 libc5 (例如 Slackware) 的話, 那差不多可以說支援得相當差,幾乎只能靠「七拼八湊」的方法來有限度地使用中文。 如果是用 libc6 (glibc2) 的話,那就有相當的 locale 支援了。 然而,目前大部分使用 glibc2 的系統都是 glibc-2.0.7, 這一版對東方語系的支援還 不夠好,特別是 LC_CTYPE ,它無法辨認、轉換我們的 Big5 碼,必須要等到 glibc-2.1 以後,才能完全解決這些問題。但這並不是說使用 glibc-2.0.7 的廣大使 用者都沒希望了,事實上有一個 libwcsmbs 的套件,它可以將 glibc 中有問題的部分 取代掉,讓我們的 LC_CTYPE 部分可以「幾乎 90% 正確」地工作。而這個套件就是目 前 CLE 的標准之一,也是很重要的一個部分,雖然大家可能感受不到它的存在。 最近 glibc-2.1 的 pre-release 已經出來,我個人已做過初步測試, LC_CTYPE 在我 們的 locale 下已經正常,雖然仍有其他問題存在,但這已是一個好消息,我預計在未來的一年內,等大部分的 Linux distribution 都換裝了 glibc-2.1 之後,我們就有 了最底層的「中文化」條件。 三、 X Window 的部分: 接著我們來看看上層, X Window 的「中文化」 (或「國際化」)。 X11R6 也有一個 locale 的目錄,在 /usr/X11R6/lib/X11/locale □頭,如果是裝 CLE 的朋友,就 會見到一個 zh_TW.Big5 的目錄,那就是我們的 XLC Locale data。在「標准」的情況 下, XLC Locale 必須架構在 libc locale 之上運作,它□頭除了定義一些字元對 應,最重要的是內碼與字型的對應。以我們的 locale 為例,我們需要兩種字型,一是「半形 (單位元)」,顯示 ASCII 碼用,另一是「全形 (雙位元)」用來顯示中文。舉 一個例子,像以下這一串字: 這是一個 abcd .... 測試字串 string! OK! 那些要用全形顯示? 那些要用半形顯示? 這必須靠 libc 的 LC_CTYPE 來判斷。因此, LC_CTYPE 如果掛掉,可以說什麽都沒辄。 我相信,有了上述的「配備」後,基本的 I18N 環境就已經具備了。但一定有人會問: 「看起來 CLE 在上述所說的都沒問題,為什麽還是到處都不是中文?」 沒錯,那是因 為目前 Linux 上大部分的程式還不是用 I18N 的標准而寫的。例如大家常用的Netscape, xcin, crxvt .... 等等,它們都是用「自己」的招術來處理中文,這也就 是為什麽 xcin 只能在 crxvt 上輸入,為什麽我們要靠 CXWin 來看中文 .... 等等。 這些都不是正解,只是暫時的一個手段,最後都是要放棄的。 目前,有越來越多程式將朝向 I18N 來發展,而我們目前最需要的工作,就是弄 I18N 的 zh_TW.Big5 部分。舉個例子,目前 CLE group 正忙於 GNOME 的中文化,它算是目 前 I18N 化相當徹底的一個 X Disktop / Window Manager, Platin 預計在下一版的 CLE 就是以 GNOME 為主,只要將其中的訊息都翻譯成中文,做好 LC_MESSAGES 的工 作,未來在 GNOME 中,將不需要依靠 CXWin, 打開後就到處都是中文。 其他的 GNU 軟體也是,有另一組人馬正將一些常見指令如 ls, cp 等的訊息中文化, 並將結果回報給 GNU, 期望未來新版的 GNU 軟體中,中文訊息就是標准的一部分,我 們不再需要每次人家更新版就急急忙忙地做 patch 了。 中文輸入就比較復雜,除了上述的 I18N 以外,還有一個 XIM (X Input Method) 協 定。我們必須要有 XIM server 來取代目前的 xcin, 而且還要 X Window 的應用程式 能夠遵循 XIM 協定,才能做到 "Chinese Input Anywhere"。目前 CLE 已有一個 XIM server, 即 xcin-cxim 之類的程式,但麻煩的是遵循 XIM 協定的應用程式仍不多,最 著名的就是 GNOME, xemacs, 以及一些 X11R6 所附的軟體 (如 xedit, 由 Xt 及 Xaw 提供 I18N 支援)。而我個人目前正在寫的 xcin-2.5 就是一個 XIM server, 我希望這 個軟體能在將來與「各路人馬」配合,做出一點貢獻。 因此,「中文化」的工作,並不是那麽簡單地說「因為 Linux 是免費、沒有人付錢給 程式設計師,所以做不好」,或者說「我們中國人不團結,大家不肯合作發展程式」, 或者說「 Linux 是 server 導向,不適合做中文」 .... 等等。 Linux 可以發展中 文,而且有很多人正努力地在工作,但是更重要的是,我們還得配合國外 (或說軟體的 原設計者) 的腳步。前面說過,我們要有完整 locale 支援的 libc, 這一切才有希 望,我們也需要我們常用的軟體 (如 Netscape, window manager, 甚至 database, Office ....) 的設計者覺悟到,真正的標准是 I18N, 是 locale, 是 XIM, 我們才能 跟進,將中文化的部分加進去。更重要的一點,我們自己的程式設計師在寫軟體時,是 不是也能遵循 I18N, locale, XIM?? 中文化,需要一個標准,而我們希望這個標准,是世界通用的,而不是我們自己七拼八 湊出來的。否則的話,我們永遠都要自己玩自己的,永遠都會事倍功半,永遠會抱怨 「為什麽 Linux 的中文支援比不上 Win95?」 四、中文列印: 中文列印與上述的關系較小,但也是大家關心的問題之一,在此我也稍作一些說明。 在 UNIX 的世界,就我所知印表機輸出最常見的就是兩個: ASCII 碼與 Postscript, 而 Postscript 就是「圖形列印」的共通語言。因此,當我們要做中文列印,就是要尋 求「圖形列印」的途徑,也就是找一個「能將中文字檔轉成Postscript 輸出」的程式」。目前大家常見的,如傳統的 cnprint、 CLE 中能直接使用 TTF 字型的 bg5ps, 或是 ChiTeX, CJK+LaTeX, lyx .... 等等。 在此稍微值得一提的是, CJK 似乎已漸漸成為 Free Software / Open Source 所公認 的標准之一,其原因如下: 它是 Free Software 。 目前 CJK 與 freetype 配合,已經可以完全整合到 LaTeX 的環境中,而不需要 像以往一樣需要再更動 LaTeX 的程式與環境。相信在不久的將來它應該會成為 LaTeX 的標 准附件之一。就我所知, Netscape 在下一版的列印部分將支援 CJK 做為中日文 Postscript 輸出,我想這一點很值得成為我們未來發展中文列印的一個參考。 五、准備您的 I18N 環境: 以下我針對目前大家常用的系統,如何做到像 CLE 那樣,有基本的 locale 環境,而 不必真的非裝 CLE 不可 (因為常聽大家說 CLE 太大)。雖然以下所說的對各位的中文 環境可能改善不多 (因為目前大部分的軟體都還沒有 I18N 化),但就當做是為未來做准備。也希望對 source code 有興趣,喜歡東玩玩、西摸摸 Linux 的網友們,能多多 熟悉這個領域,或者能加入這個領域與我們共同努力。 以下的軟體我以 tgz 為主,而不用 RedHat 的 RPM, 或 Debian 的 deb, 希望這個 「共通語言」在大部分的 Linux distribution 都能適用。 請確定您的 Linux 的 libc 是 glibc-2.0.7 以上,若您還是用 libc5, 請參 考您的 distribution 套件,將 glibc-2.0.7 裝起來。若您有冒險的精神,想直接玩 glibc-2.1 的話, 可以在這□找到 source: glibc-pre2.1_*.tar.gz 請注意,如果您決定玩 glibc-2.1, 您必須為自己負責,除非您