| 关键词: locale 中文 一个 Big 程式 normal medium twmoe 目前 Linux |
一、前言: 最近这个话题大家吵得有点厉害,大家都希望 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, 您必须为自己负责,除非您是有经验者, 否则您 要有「 Linux 可能会被我不小心玩挂掉」的心□准备。一个保险的做 法,是找一台空 机器,或一个空的 partition 灌一个白老鼠系统来玩。如果 您不小心出差错而造成任 何损失的话,本人不负任何责任。 如果您是用 glibc-2.1 且一切正常的话,那麽恭喜您,您可以略过这一步。 如果您是 用 glibc-2.0.7, 请至 xcin.linux.org.tw 抓 libwcsmbs-0.0.4.tar.gz 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 如果您是使用 glibc-2.0.7 的话,请跳过这一步。若您是用 glibc-2.1, 您的系 统多 半还没有 zh_TW.Big5 locale data, 此 locale data 可以在上述 wcsmbs-locale 套 件中找到。请将该套件抓回并解开後,找到 localedata 目录下的 zh_TW.Big5 及 charmaps/BIG5 两个档,这两个分别是 locale def 与 charmap 档,您必须 将这两个 档 compile 之後才能使用: localedef -i zh_TW.Big5 -f BIG5 -u charids.894 zh_TW.Big5 (有关 localedef 的用法请见 localedef --help), compile 完成後的 locale data 会自动安装到 /usr/share/locale/zh_TW.big5 下,但由於我们的 locale 名是 zh_TW.Big5, 所以请您自行将它改名,或做一个 symbolic link。 请抓回 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 您如果没有中文字型的话,必须抓几个回来装。我个人建议使用 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 化,因此这□提供两个 例子供您测试: 在 wcsmbs-locale 套件的 source 中,请到 test 目录 make 一下,执行 testmwm 程 式,然後输入任意 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|