Linux 的中文化问题简介( 五 )



--------------------------------------------------------------------------------

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;读取档案可能会不正常)

六、撰写;I18N;的程式:;
在此我将我的一些心得与大家分享 。由於这个问题牵涉的层面很广,而我只有针对部分子题稍微摸索一下,因此本文的目的不在於成为一个「完整」的文件说明,也许做为入门导引来得好些,希望能对;I18N;程式写作有兴趣的朋友提供一个方向 。有兴趣的朋友同时也可以参考;info;libc;的;Locale;章节,以及;


http://i44www.info.uni-karlsruhe.de/~drepper/conf96/paper.html
http://www.pgroup.com/ppro_docs/pgC_lib/stdlibug/int_6094.htm
(感谢;Pofeng;Lee;的提供);
ftp.nctu.edu.tw:;/documents/FAQ/comp/answers/internationalization/programming-faq.gz
(感谢;stevel;兄提供);
头有更完整的说明 。;
除此之外,在这我也会参杂一些我个人的理念,不一定是对的,仅供参考,也请各位多多给予我批评与指教 。;

 ;

第一步:;setlocale;(详见;man;setlocale;与其他相关;man;page);
程式的第一步必须要设定;locale,;而一般的写法是;locale;资料是经由环境变数取得,而不要写死在程式头,例如:;


--------------------------------------------------------------------------------

#include;

main()
{
setlocale(LC_ALL,;"");
.....
}


--------------------------------------------------------------------------------
或分别设定:;
setlocale(LC_CTYPE,;"");
setlocale(LC_MESSAGES,;"");
.....

我个人的建议是,在;setlocale();时只要设我们程式中需要的项目即可,而不要设;LC_ALL,;原因是在某些;locale;下;(如我们的;zh_TW.Big5),;并非所有的项目都能正确运作 。我想对大部分的程式而言,设好;LC_CTYPE;与;LC_MESSAGES;就差不多了,故以下我针对这两个做说明 。;
wcs.;vs.;mbs.;(详见;man;mbstowcs;与相关;man;page);
"wcs";是;"wide-chararater;string";的缩写,而;"mbs";是;"multi-byte;string";的缩写,二者分别代表字串的表现方式 。所谓的;multi-byte;是指数个;char;组成一个字;(如全形字或中文字是由两个;char;组成),而;wide-char;是指一个;wchar_t;type;就是一个字,;而;sizeof(wchar_t);的大小与系统有关,一般而言是;4;bytes 。一般我们可以直接看、输出输入等都是;multi-byte,;如:;

char;*str;=;"这是一个句子:;abcd";

但我们会建议在程式内部,用;mbstowcs();将它转成;wchar_t;来统一处理,这个转换其实是根据;locale;中的;LC_CTYPE;的机制,它定义了;multi-byte;与;wide-;char;值二者间的对应关 。做这样转换的好处是,您不用担心全形、半形的问题,因为一个;wchar_t;矩阵元就是一个字 。;
wchar_t;有一组与;string.h;中相对应的字串处理函式;(目前在;Linux;中可能还没有;man;page;说明),就定义在;wchar.h;中,让我们可以如同处理;(char;*);那样地处理;(wchar_t;*),;其部分的对应关如下,其他的可以直接看;wchar.h;的内容:;

wcscpy()<====>;;strcpy()
wcsncpy();;;;;;;<====>;;strncpy()
wcslen()<====>;;strlen()
wcsdup()<====>;;strdup()
wcscmp()<====>;;strcmp()
wcsncmp();;;;;;;<====>;;strncmp()
........................................

由於;mbs;码与;wcs;码的对应关是由该;locale;的;LC_CTYPE;来决定的,也就是不同的;locale;写法其对应关可能会不一样 。就我们的;glibc2,;zh_TW.Big5;locale;而言,由;mbs;转成的;wcs;即为;unicode;(有关;unicode;的资讯可以在;http://www.unicode.org/;中找到),但不能保在其他的系统或环境下也是如此 。故最保险的做法,是将字串储存成;multi-byte,;然後在;run-time;时才用;mbstowcs();转成;wide-char;来运作 。;

推荐阅读