| 网站首页 | 硬件维修 | 应用学院 | 网络组建 | 网站制作 | 菜鸟黑客 | 编程之道 | 数码大全 | 娱乐休闲 | 软件下载 | 在线视频 | 请您留言 | 技术论坛 | 
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
  • Alumin远程访问控制软件 让你…

  • 浏览器操作记录工具Internet…

  • 让Google Deskbar实现简体中…

  • 网页打不开 Windows的Hosts表…

  • windows IE浏览器精典技巧两…

  • 实现了!中文WinXP安装IE7 B…

  • 腾讯TT浏览器V2.03简体中文版

  • 解决微软IE 6.0的三个典型问…

  • QQ2005Beta3超级视频问题解答

  • 解决珊瑚虫QQ不能在Win2003运…

  • Q
    您现在的位置: 我是IT人 >> 应用学院 >> 操作系统 >> Linux >> 教程正文
    Linux 的中文化问题简介           
    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] 下一页  

    教程录入:小秦    责任编辑:小秦 
  • 上一篇教程:

  • 下一篇教程:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 关于我们 | 友情链接 | 版权申明 |