📄 00000001.htm
字号:
那些要用全形显示? 那些要用半形显示? 这必须靠 libc 的 LC_CTYPE <BR> <BR> 来判断。因 此, LC_CTYPE 如果挂掉,可以说什麽都没辄。 <BR> <BR> <BR> 我相信,有了上述的「配备」後,基本的 I18N 环境就已经具备了。 <BR> <BR> 但一定有人会 问: 「看起来 CLE 在上述所说的都没问题,为什麽还 <BR> <BR> 是到处都不是中文?」 没错, 那是因为目前 Linux 上大部分的程式 <BR> <BR> 还不是用 I18N 的标准而写的。例如大家常用 的 Netscape, xcin, <BR> <BR> crxvt .... 等等,它们都是用「自己」的招术来处理中文, 这也就 <BR> <BR> 是为什麽 xcin 只能在 crxvt 上输入,为什麽我们要靠 CXWin 来看 <BR> <BR> 中文 .... 等等。这些都不是正解,只是暂时的一个手段,最後都是 <BR> <BR> 要放弃的。 <BR> <BR> <BR> 目前,有越来越多程式将朝向 I18N 来发展,而我们目前最需要的工 <BR> <BR> 作,就是弄 I18N 的 zh_TW.Big5 部分。举个例子,目前 CLE group <BR> <BR> 正忙於 GNOME 的中文化, 它算是目前 I18N 化相当彻底的一个 X <BR> <BR> Disktop / Window Manager, Platin 预计 在下一版的 CLE 就是以 <BR> <BR> GNOME 为主,只要将其中的讯息都翻译成中文,做好 LC_MESSAGES 的 <BR> <BR> 工作,未来在 GNOME 中,将不需要依靠 CXWin, 打开後就到处都 是 <BR> <BR> 中文。 <BR> <BR> <BR> 其他的 GNU 软体也是,有另一组人马正将一些常见指令如 ls, cp 等 <BR> <BR> 的讯息中文 化,并将结果回报给 GNU, 期望未来新版的 GNU 软体 <BR> <BR> 中,中文讯息就是标准的一 部分,我们不再需要每次人家更新版就急 <BR> <BR> 急忙忙地做 patch 了。 <BR> <BR> <BR> 中文输入就比较复杂,除了上述的 I18N 以外,还有一个 XIM (X <BR> <BR> Input Method) 协定。我们必须要有 XIM server 来取代目前的 <BR> <BR> xcin, 而且还要 X Window 的应 用程式能够遵循 XIM 协定,才能做 <BR> <BR> 到 "Chinese Input Anywhere"。目前 CLE 已 有一个 XIM server, <BR> <BR> 即 xcin-cxim 之类的程式,但麻烦的是遵循 XIM 协定的应 用程式仍 <BR> <BR> 不多,最著名的就是 GNOME, xemacs, 以及一些 X11R6 所附的软体 <BR> <BR> (如 xedit, 由 Xt 及 Xaw 提供 I18N 支援)。而我个人目前正在写的 <BR> <BR> xcin-2.5 就是一个 XIM server, 我希望这个软体能在将来与「各路 <BR> <BR> 人马」配合,做出一点贡献。 <BR> <BR> <BR> 因此,「中文化」的工作,并不是那麽简单地说「因为 Linux 是免 <BR> <BR> 费、没有人付 钱给程式设计师,所以做不好」,或者说「我们中国人 <BR> <BR> 不团结,大家不肯合作发 展程式」,或者说「 Linux 是 server 导 <BR> <BR> 向,不适合做中文」 .... 等等。 Linux 可以发展中文,而且有很多 <BR> <BR> 人正努力地在工作,但是更重要的是,我们还得配合国 外 (或说软体 <BR> <BR> 的原设计者) 的脚步。前面说过,我们要有完整 locale 支援的 <BR> <BR> libc, 这一切才有希望,我们也需要我们常用的软体 (如 Netscape, <BR> <BR> window manager, 甚至 database, office ....) 的设计者觉悟到, <BR> <BR> 真正的标准是 I18N, 是 locale, 是 XIM, 我们才能跟进,将中文化 <BR> <BR> 的部分加进去。更重要的一点,我们自己的程式 设计师在写软体时, <BR> <BR> 是不是也能遵循 I18N, locale, XI <BR> 供参考,也请各 位多多给予我批评与指教。 <BR> <BR> <BR> 1.第一步: setlocale (详见 man setlocale 与其他相关 man <BR> <BR> page) <BR> <BR> <BR> 程式的第一步必须要设定 locale, 而一般的写法是 locale 资料 <BR> <BR> 是经由环境变数取 得,而不要写死在程式□头,例如: <BR> <BR> <BR> <BR> #include <BR> <BR> main() <BR> <BR> { <BR> <BR> setlocale(LC_ALL, ""); <BR> <BR> ..... <BR> <BR> } <BR> <BR> <BR> <BR> 或分别设定: <BR> <BR> <BR> setlocale(LC_CTYPE, ""); <BR> <BR> setlocale(LC_MESSAGES, ""); <BR> <BR> ..... <BR> <BR> <BR> 我个人的建议是,在 setlocale() 时只要设我们程式中需要的项 <BR> <BR> 目即可,而不要设 LC_ALL, 原因是在某些 locale 下 (如我们的 <BR> <BR> zh_TW.Big5), 并非所有的项目都能 正确运作。我想对大部分的 <BR> <BR> 程式而言,设好 LC_CTYPE 与 LC_MESSAGES 就差不多了, 故以 <BR> <BR> 下我针对这两个做说明。 <BR> <BR> 2.wcs. vs. mbs. (详见 man mbstowcs 与相关 man page) <BR> <BR> <BR> "wcs" 是 "wide-chararater string" 的缩写,而 "mbs" 是 <BR> <BR> "multi-byte string" 的缩写,二者分别代表字串的表现方式。 <BR> <BR> 所谓的 multi-byte 是指数个 char 组成 一个字 (如全形字或中 <BR> <BR> 文字是由两个 char 组成),而 wide-char 是指一个 wchar_t <BR> <BR> type 就是一个字, 而 sizeof(wchar_t) 的大小与系统有关,一 <BR> <BR> 般而言是 4 bytes。 一般我们可以直接看、输出输入等都是 <BR> <BR> multi-byte, 如: <BR> <BR> <BR> char *str = "这是一个句子: abcd"; <BR> <BR> <BR> 但我们会建议在程式内部,用 mbstowcs() 将它转成 wchar_t 来 <BR> <BR> 统一处理,这个 转换其实是根据 locale 中的 LC_CTYPE 的机 <BR> <BR> 制,它定义了 multi-byte 与 wide- char 值二者间的对应关 <BR> <BR> 系。做这样转换的好处是,您不用担心全形、半形的问题, 因为 <BR> <BR> 一个 wchar_t 矩阵元就是一个字。 <BR> <BR> <BR> wchar_t 有一组与 string.h 中相对应的字串处理函式 (目前在 <BR> <BR> Linux 中可能还没 有 man page 说明),就定义在 wchar.h 中, <BR> <BR> 让我们可以如同处理 (char *) 那样 地处理 (wchar_t *), 其部 <BR> <BR> 分的对应关系如下,其他的可以直接看 wchar.h 的内容: <BR> <BR> <BR> wcscpy() <====> strcpy() <BR> <BR> wcsncpy() <====> strncpy() <BR> <BR> wcslen() <====> strlen() <BR> <BR> wcsdup() <====> strdup() <BR> <BR> wcscmp() <====> strcmp() <BR> <BR> wcsncmp() <====> strncmp() <BR> <BR> ........................................ <BR> <BR> <BR> 由於 mbs 码与 wcs 码的对应关系是由该 locale 的 LC_CTYPE <BR> <BR> 来决定的,也就是不 同的 locale 写法其对应关系可能会不一 <BR> <BR> 样。就我们的 glibc2, zh_TW.Big5 locale 而言,由 mbs 转成 <BR> <BR> 的 wcs 即为 unicode (有关 unicode 的资讯可以在 <BR> <BR> <A HREF="http://www.unicode.org/">http://www.unicode.org/</A> 中找到),但不能保证在其他的系统或 <BR> <BR> 环境下也是如此。 故最保险的做法,是将字串储存成 <BR> <BR> multi-byte, 然後在 run-time 时才用 mbstowcs() 转成 <BR> <BR> wide-char 来运作。 <BR> <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -