class="22358">
作者按
底下这篇文章是我最近写程式的一点点心得,除了前段部讨论了;Linux;I18N;环境外;(已在;Linux;连线版贴出),後半部还加了一些有关;I18N;程式写作的简介。我想这篇文章就发表在;CLDP;上,希望;CLDP;可以收录。更希望这篇文章对有兴趣的朋友有帮助,让大家能早日进入;I18N;的世界;:-));
由於我所知很有限,所以文章中可能有很多错误,而关於;Xi18n;的部分,我也有很多因为没有去研究,故略过不提了。因此,希望各位高手能多多给我批评与建议,或帮忙我将不足之处补齐,让这篇文章更完美。;
在此先谢谢各位。;
谢东翰;(Tung-Han;Hsieh);
--------------------------------------------------------------------------------
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;太大)。虽然以下所说的对各位的中文环境可能改善不多;(因为目前大部分的软体都