有关 Linux 的中文化
最近这个话题大家吵得有点厉害,大家都希望 Linux 能在中文方面有所进步,各家有各家的说法,莫衷一是。由於我最近常与 CLE 的 group 有联系,同时也正在写一些与中文相关的程式,因此我大略说一下「我们正在做什麽」,让大家参考。
我希望大家能将这篇文章当做技术性文章来读,不要再有情绪化的批评,必境我们要的是 solution, 情绪化的批评对我们实在没有帮助。除此之外,我的观点可能有错,也可能过份乐观了一点,也欢迎大家能就技术方面给予我指教。
要将 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_MONETARY: 货币格式
LC_COLLATE: 特殊字串比较
其中,与一般使用者最有关系的,是 LC_CTYPE 与 LC_MESSAGES 。 LC_CTYPE 直接关系到某些字元或内码在目前的 locale 下是否可印? 要如何转换? 对应到那一个字? .... 等等。 LC_MESSAGES 则关系到软体的讯息输出是不是中文。真正完整的 locale 支援,是当我们在 shell prompt 下,直接设好环境变数,则我们马上就能切换到那个语言了。例如:
bash: export LC_CTYPE=zh_TW.Big5
目前 Linux 对於 locale 的支援如何? 可以大概地说,西方语系差不多没问题了,但东方语系还有不少问题。如果您的 Linux 系统是用 libc5 (例如 Slackware) 的话,那差不多可以说支援得相当差,几乎只能靠「七拼八凑」的方法来有限度地使用中文。如果是用 libc6 (glibc2) 的话,那就有相当的 locale 支援了 (但还是有些问题存在)。
libc 有了 locale 支援,我们自己还得要有自己的 locale data, 这样它才能「吃中文」。由於前人与 CLE group 的努力,目前我们已有自己的 locale data 了。有安装 CLE 的朋友可以到 /usr/share/locale 下看看, zh_TW.Big5 就是我们的 locale data, 虽然还不够完整,但已能 work。
然而,目前大部分使用 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Forceps注: glibc-2.1已经推出
在我们的 locale 下已经正常,虽然仍有其他问题存在,但这已是一个好消息,我预计在未来的一年内,等大部分的 Linux distribution 都换装了 glibc-2.1 之後,我们就有了最底层的「中文化」条件。
接着我们来看看上层, 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 化相当彻底的一个 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)。而我个人目前正在写的 xcin-2.5, 就是一个 XIM server, 我希望这个软体能在将来与其他「各路人马」配合,做出一点贡献。
因此,「中文化」的工作,并不是那麽简单地说「因为 Linux 是免费、没有人付钱可程式设计师,所以做不好」,或者说「我们中国人不团结,大家不肯合作发展程式」,或者说「 Linux 是 server 导向,不适合做中文」 .... 等等。Linux 可以发展中文,而且有很多人正努力地在工作,但是更重要的是,我们还得配合国外 (或说软体的原设计者) 的脚步。前面说过,我们要有完整 locale 支援的 libc, 这一切才有希望,我们也需要我们常用的软体 (如 Netscape, window manager, 甚至 database, office ....) 的设计者觉悟到,真正的标准是 I18N, 是 locale, 是 XIM, 我们才能跟进,将中文化的部分加进去。更重要的一点,我们自己的程式设计师在写软体时,是不是也能遵循 I18N, locale, XIM??
中文化,需要一个标准,而我们希望这个标准,是世界通用的,而不是我们自己七拼八凑出来的。否则的话,我们永远都要自己玩自己的,永远都会事倍功半,永远会抱怨「为什麽 Linux 的中文支援比不上 Win95?」
好了,以下我针对目前大家常用的系统,如何做到像 CLE 那样,有基本的 locale 环境,而不必真的非装 CLE 不可 (因为常听大家说 CLE 太大)。虽然以下所说的对各位的中文环境可能改善不多 (因为目前大部分的软体都还没有 I18N 化),当就当做是为未来做准备,也希望各位对 source code 有兴趣,喜欢东玩玩、西摸摸 Linux 的网友,能多多熟悉这个领域,或者能加入这个领域与我们共同努力。
以下的软体我以 tgz 为主,而不用 RedHat 的 RPM, 或 Debian 的 deb, 希望这个「共通语言」在大部分的 Linux distribution 都能适用。
1. 请确定您的 Linux 的 libc 是 glibc-2.0.7 以上,若您还是用 libc5, 请参考您的 distribution 套件,将 glibc-2.0.7 装起来。
若您有冒险的精神,想直接玩 glibc-2.1 的话,可以在这里找到 source:
ftp://linux.sinica.edu.tw/pub1/debian/dists/potato/main/binary-i386/devel/ glibc-pre2.1_*.tar.gz
请注意,如果您决定玩 glibc-2.1, 您必须为自己负责,除非您是有经验者,否则您要有「 Linux 可能会被我不小心玩挂掉」的心里准备。一个保险的做法,是找一台空机器,或一个空的 partition 灌一个白老鼠系统来玩。如果您不小心出差错而造成任何损失的话,本人不负任何责任。
2. 如果您是用 glibc-2.1 且一切正常的话,那麽恭喜您,您可以略过这一步。如果您是用 glibc-2.0.7, 请抓
ftp://xcin.linux.org.tw/pub/xcin/libwcs/libwcsmbs-0.0.4.tar.gz ftp://xcin.linux.org.tw/pub/xcin/libwcs/wcsmbs-locale-0.4.7.tar.gz
并将它们装起来。这两个套件其实是来自 CLE, 其中特别注意 wcsmbs-locale 这个套件,其原始套件不包函 zh_TW.Big5 locale data, 这个 locale data 是 Platin 加入的,有了它才有用。然後,在 /etc/profile 中加一行:
export LD_PRELOAD=<路径名>/libwcsmbs.so
3. 请抓回
ftp://xcin.linux.org.tw/pub/xcin/libwcs/XLC_LOCALE
档,并放在 /usr/X11R6/lib/X11/locale/zh_TW.Big5 目录下 (您可能需要自行建此目录) ,同时修改 /usr/X11R6/lib/X11/locale/locale.dir 档,在最後加入这一行:
zh_TW.Big5/XLC_LOCALE zh_TW.Big5
4. 您如果没有中文字型的话,必须抓几个回来装。我个人建议使用 twmoe 字型,您应该可以在
ftp://linux.cis.nctu.edu.tw/pcakges/Chinese
里头找到。 twmoe 字型非常多,您不用全抓,像我就只有
kai14.pcf.gz kai15.pcf.gz kai16.pcf.gz kai18.pcf.gz kai20.pcf.gz kai24.pcf.gz
而已。安装方式是: 造一个 /usr/X11R6/lib/X11/fonts/chinese 目录,将字型档放进去,在那个目录下执行 mkfontdir, 在 /etc/X11/XF86Config 中将 /usr/X11R6/lib/X11/fonts/chinese 这个路径加入 FontPath 列表里头。最後在那个目录下写一个 fonts.alias 档,建议内容如下
kai18 -twmoe-kai-medium-r-normal--18-180-75-75-c-180-big5-1 kai16 -twmoe-kai-medium-r-normal--16-160-75-75-c-160-big5-1 kai20 -twmoe-kai-medium-r-normal--20-200-75-75-c-200-big5-1 kai14 -twmoe-kai-medium-r-normal--14-140-75-75-c-140-big5-1 kai15 -twmoe-kai-medium-r-normal--15-150-75-75-c-150-big5-1 kai24 -twmoe-kai-medium-r-normal--24-240-75-75-c-240-big5-1
-twmoe-kai-medium-r-normal-fs-18-180-75-75-c-180-big5-0 (接下一行) -twmoe-kai-medium-r-normal--18-180-75-75-c-180-big5-1 -twmoe-kai-medium-r-normal-fs-16-160-75-75-c-160-big5-0 (接下一行) -twmoe-kai-medium-r-normal--16-160-75-75-c-160-big5-1 -twmoe-kai-medium-r-normal-fs-20-200-75-75-c-200-big5-0 (接下一行) -twmoe-kai-medium-r-normal--20-200-75-75-c-200-big5-1 -twmoe-kai-medium-r-normal-fs-14-140-75-75-c-140-big5-0 (接下一行) -twmoe-kai-medium-r-normal--14-140-75-75-c-140-big5-1 -twmoe-kai-medium-r-normal-fs-15-150-75-75-c-150-big5-0 (接下一行) -twmoe-kai-medium-r-normal--15-150-75-75-c-150-big5-1 -twmoe-kai-medium-r-normal-fs-24-240-75-75-c-240-big5-0 (接下一行) -twmoe-kai-medium-r-normal--24-240-75-75-c-240-big5-1
然後重新进入 X-Window 。
到此为止,您的系统已具备 I18N 的环境了,如果应用程式有支援 I18N, 则只要您设以下的环境变数:
export LC_CTYPE=zh_TW.Big5 (字元显示、转换为 zh_TW.Big5) export LC_MESSAGES=zh_TW.Big5 (讯息显示为中文)
或
export LC_ALL=zh_TW.Big5 export LANG=zh_TW.Big5 (二者皆为所有的东东都变成中文)
则应该马上可以见到效果。但由於大部分的程式都还没有 I18N 化,因此这里提供两个例子供您测试:
1. 在 wcsmbs-locale 套件的 source 中,请到 test 目录 make 一下,执行 testmwm 程式,然後输入任意中英文字 (用 xcin & crxvt) 後按 return, 像这样:
THH:thhpc $ testmwm 我是居士 1234567 mb -> wc, size: 13 wc -> mb, size: 17 a7 da ac 4f a9 7e a4 68 20 31 32 33 34 35 36 37 0a string in buffer *after* mb -> wc then wc -> mb 我是居士 1234567
表示 LC_CTYPE locale 成功了,若是
THH:thhpc $ testmwm 我是居士 1234567 mb -> wc, size: -1 wc -> mb, size: 0
表示没有成功。可能原因是: 您没有设 LD_PRELOAD? 没有设 LC_CTYPE? 或您以上的安装出错了?
2. 您可以在 xedit 中显示中文。但因为 Xlib 有一个 bug, 请您找这个软体回来 compile:
ftp://xcin.linux.org.tw/pub/xcin/libwcs/lcGen.tar.gz
然後在您的 $HOME/.Xresources 中加入:
xtDefaultFontSet: -*-big5-0,-adobe-*-iso8859-1 xedit*international: True xedit*fontSet: -*-big5-0, -adobe-*-iso8859-1
执行:
xrdb merge ~/.Xresources LD_PRELOAD=“<路径名>/libwcsmbs.so <路径名>/lcGen.so“ xedit
这时会跑出一个 xedit 视窗,您可以用 xcin & crxvt 在别的地方先打好一段中英文文字,然後用滑鼠 cut & copy 到 xedit, 是不是见到正确的中文了?
(PS. xedit 还有点问题,所以用这个方式用 xedit 读取档案可能会不正常)
****************************************************************
以上资料,仅供参考,欢迎大家指教。
发布人:netbull 来自:中国Unix联盟