| Linux 的中文化问题简介 |
|
作者:网络 文章来源:转载 点击数: 更新时间:2005-8-15 |
| [ 字体:缩小 正常 放大 | 双击自动滚屏 ] |
请选择合适的字体颜色:
|
|
或
export LC_ALL=zh_TW.Big5
export LANG=zh_TW.Big5 (二者皆为所有的东东都变成中文)
则应该马上可以见到效果。但由於大部分的程式都还没有 I18N 化,因此这□提供两个
例子供您测试:
在 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? 或您以上 的
安装出错了?
您可以在 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 读取档案可能会不正常)
六、撰写 I18N 的程式:
在此我将我的一些心得与大家分享。由於这个问题牵涉的层面很广,而我只有针对部分
子题稍微摸索一下,因此本文的目的不在於成为一个「完整」的文件说明,也许做为入
门导引来得好些,希望能对 I18N 程式写作有兴趣的朋友提供一个方向。有兴趣的朋友
同时也可以参考 info libc 的 Locale 章节,以及
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 来运作。
讯息输出 (详见 info gettext):
一般我们程式的讯息输出,是经由 stdio.h □头的函式,直接输出到 stdout 或
stderr, 而输出的内容是直接写死在程式码中。这样的程式要做多国语文化会造成困
扰,因为我们必须要修改原始码,将所有的讯息字串翻译成另一种语文。因此,我们必上一页 [1] [2] [3] [4] [5] 下一页 |
|
| 教程录入:小秦 责任编辑:小秦 |
上一篇教程: 关于Mandrake中文问题的几点建议 下一篇教程: Chinput 安装指南 |
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |