原帖由 blitzkrieg 于 2007-3-27 19:47 发表
就是在linux下做了中文的界面,可是软件在windows下面运行就没法显示中文。出来的都是乱码,用的是UTF8
请问有什么办法解决吗?问题会出在哪里呢?

最好有截图说明问题啊
还有使用的开发语言
也许我永远到不了彩虹天堂,但那会是我最真实的梦!

TOP

TOP

原帖由 谷歌 于 2007-3-27 20:15 发表
说白了 就是现实不了中文??


也对,截图现在没办法。因为真正提问题的人上不了网

[ 本帖最后由 blitzkrieg 于 2007-3-27 20:23 编辑 ]

TOP

原帖由 sagood 于 2007-3-27 20:13 发表

最好有截图说明问题啊
还有使用的开发语言


是java就没这问题了。

TOP

做得是网页?还是应用程序?还是共享目录?还是ftp?还是什么别的。。。

TOP

原帖由 Aptor 于 2007-3-27 21:49 发表
做得是网页?还是应用程序?还是共享目录?还是ftp?还是什么别的。。。

类似于sap的软件,现在汉化。源程序ms用C编的,界面应该是用java的

[ 本帖最后由 blitzkrieg 于 2007-3-27 21:58 编辑 ]

TOP

windows的内码是设置的中文的么?
冬冤家,我有心将你打,却一个心儿怕;要不打,只恨你这冤家羞人煞;罢罢罢,低眉红了脸儿帕,嫁了吧!

TOP

希望有帮助,转贴自www.linuxforum.com


Linux 的中文化问题简介

       作者按
        
         
                 底下这篇文章是我最近写程式的一点点心得,除了前段
                 部讨论了 Linux I18N 环境外 (已在 Linux 连线版贴
                 出),後半部还加了一些有关 I18N 程式写作的简介。
                 我想这篇文章就发表在 CLDP 上, 希望 CLDP 可以收
                 录。更希望这篇文章对有兴趣的朋友有帮助, 让大家
                 能早日进入 I18N 的世界 :-))  
         
                 由於我所知很有限,所以文章中可能有很多错误,而关
                 於 Xi18n 的部分, 我也有很多因为没有去研究,故略
                 过不提了。 因此,希望各位高手能多多给我批评与建
                 议, 或帮忙我将不足之处补齐,让这篇文章更完美。  
         
                 在此先谢谢各位。  
         
                 谢东翰 (Tung-Han Hsieh) <thhsieh@twcpro.phys.ntu.edu.tw>  
        
        
        
                            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, XI   
         供参考,也请各 位多多给予我批评与指教。  
        
           1.第一步: setlocale (详见 man setlocale 与其他相关 manpage)  
        
              程式的第一步必须要设定 locale, 而一般的写法是 locale 资料
              是经由环境变数取 得,而不要写死在程式□头,例如:  
        
              #include <stdio.h>
              main()
              {
                      setlocale(LC_ALL, "");
                      .....
              }
        
              或分别设定:  
         
                      setlocale(LC_CTYPE, "");
                      setlocale(LC_MESSAGES, "");
                      .....
        
              我个人的建议是,在 setlocale() 时只要设我们程式中需要的项
              目即可,而不要设 LC_ALL, 原因是在某些 locale 下 (如我们的
              zh_TW.Big5), 并非所有的项目都能 正确运作。我想对大部分的
              程式而言,设好 LC_CTYPE 与 LC_MESSAGES 就差不多了, 故以
              下我针对这两个做说明。  
         
           2.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 来运作。

TOP

3.讯息输出 (详见 info gettext):  
         
              一般我们程式的讯息输出,是经由 stdio.h □头的函式,直接输
              出到 stdout 或 stderr, 而输出的内容是直接写死在程式码中。
              这样的程式要做多国语文化会造成困 扰,因为我们必须要修改原
              始码,将所有的讯息字串翻译成另一种语文。因此,我们 必须透
              过 locale 的 LC_MESSAGES 来处理讯息输出。其原理很简单,就
              是将程式中 的所有讯息抽离出来,为每一个 locale 分别做好一
              个讯息档,当程式要输出讯息时, 则透过 libc 的函式依目前的
              locale 去正确的讯息档中抓取讯息。  
         
              在此我用 GNU gettext 为例,简单说明其原理。在
              /usr/share/locale 中,□头有 各种 locale 的资料目录。而每
              个目录下,都会有一个 LC_MESSAGES 的目录,而这 些目录就是
              用来放各别程式的讯息档。例如:  
        
                 /usr/share/locale/ja/LC_MESSAGES/prog.mo                (日文)
                 /usr/share/locale/zh_TW.Big5/LC_MESSAGES/prog.mo        (Big5)
        
              其中在 ja/ 目录下的 prog.mo 就是 prog 这个程式的日文讯
              息,而 zh_TW.Big5/ 下的 prog.mo 就是 prog 这个程式的中文
              讯息。假设在还没加入 LC_MESSAGES 支 援之前, prog.c 长得
              像这样:  
        
              #include  <stdio.h>
              main()
              {
                  printf("This is a test string.\n");
              }
        
              现在我们要用 gettext 来加入支援,则程式只要改成:  
        
              #include  <stdio.h>
              #include  <locale.h>
              #define _(STRING) gettext(STRING)
              #define PACKAGE "prog"
         
              main()
              {
                  setlocale(LC_MESSAGES, "");
                  textdomain(PACKAGE);
                      /* 这□就是指定用
                          /usr/share/locale/$LOC/LC_MESSAGES/prog.mo
                         作为讯息档。其中 $LOC 是在 setlocale 中设定的 */
                  printf(_("This is a test string.\n"));
                      /* 使用 gettext 来抓出讯息,再交给 printf 来印 */
              }
        
              如果在指定的 locale 下找不到 prog.mo 档,则程式就直接以原
              英文讯息印出。因 此,加入 LC_MESSAGES 的支援,原 source
              code 修改并不多,其实相当方便。  
        
              比较麻烦的是各 locale 下的讯息档制作,而这些步骤可以经由
              GNU gettext 套件 很容易地达成,其步骤简述如下 (详见 info
              gettext):  
        
                          xgettext    editor   msgfmt  (install)
                 source code --> .pot --> .pox --> .gmo --> .mo -->  
                 (节录自 Platin.bbs@csie.nctu.edu.tw 的文章:
         
                         [REF] 关於 gettext (一、简介))
        
                   使用 xgettext 产生 .pot 档:  
        
                           xgettext -a -o prog.pot prog.c  
         
                   而 prog.pot 档的内容如下:  
        
         
                   # SOME DESCRIPTIVE TITLE.
                   # Copyright (C) YEAR Free Software Foundation, Inc.
                   # FIRST AUTHOR , YEAR.
                   #
                   #: prog.c:8
                   #, fuzzy
                   msgid ""
                   msgstr ""
                   "Project-Id-Version: PACKAGE VERSION\n"
                   "POT-Creation-Date: 1999-02-28 19:18+0800\n"
                   "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
                   "Last-Translator: FULL NAME \n"
                   "Language-Team: LANGUAGE \n"
                   "MIME-Version: 1.0\n"
                   "Content-Type: text/plain; charset=CHARSET\n"
                   "Content-Transfer-Encoding: ENCODING\n"
         
                   #: prog.c:10
                   msgid "This is a test string.\n"
                   msgstr ""
        
         
                   各位可以注意到倒数两行, msgid 就是原来 source □头
                   的英文讯息,而我 们可以直接在 msgstr 中将原讯息翻译
                   成中文。所以,接下来的工作其实就 是翻译,我们可以用
                   任意的编辑器编辑这个档案,并将翻译好的档案存成
                   prog.pox 档。  
         
                   将 prog.pox 编译成 prog.gmo:  
         
                              msgfmt -o prog.gmo prog.pox
        
         
                   其中 prog.gmo。就是我们要的讯息档,等到我们把它安装
                   到  
        
                        /usr/share/locale/..../LC_MESSAGES/
        
                   之後,就名改为 prog.mo 。在此, .pot, pox, gmo 等附
                   档名是 info gettext 中建议的,分别代表未翻译前的讯息
                   原始档、翻译後的讯息原始档、 经 GNU gettext 套件编译
                   後的讯息档。  
         
         七、撰写 Xi18n 程式:  
         
         Xi18n 意指在 X Window 中加入 I18N 的支援。除了上述的部分外,
         Xi18n 还需要 考虑字形设定、图形字串输出、以及输入的问题。由於
         目前我只有看过 Xlib, 对於 其他 Widget 还没有深入研究,因此我
         只能对 Xlib 的部分稍作说明。而这类的参考 资料,有兴趣的朋友可
         以找  
        
         The Definitive Guides to the X Window System  
        
         这一系列的书来看,出版商是 O'Reilly & Associates Inc. ,其中
         有两本  
        
         
           1.Volume One, Xlib Programming Manual (for Version 11)  
              Author: Adrian Nye  
           2.R6 Update for the R5 Editions of vols. 1, 2, 4, & 5
              Programmer's Supplement for Release 6 of the X Window
              System.  
              Author: Adrian Nye  
        
         在 I18N 方面有详尽的资料,很值得参考。或者是可以看看 XFree86
         内附的 .ps 文 件 (如果您有安装的话,应该在
         /usr/X11R6/lib/X11/doc □头)。  
        
           1.第一步 (详见 man XSupportsLocale):  
         
              除了 setlocale() 之外,您还要呼叫 XSupportsLocale() 来确
              定 X Window 对您 目前的 locale 是否有支援。另外,您还要呼
              叫 XSetLocaleModifiers() 来设定 一些 X-modifier 的值,□
              例如下:  
        
         
              main()
              {
                 setlocale(LC_CTYPE, "");
                 if (XSupportsLocale() != True) {
                      printf("error X locale setting\n");
                      exit(0);
                 }
                 XSetLocaleModifiers("");
              }
        
              在此我们用 X11/Xlocale.h 来取代原来的 locale.h, 这是
              "Xlib programming manual" 书中建议的,在其备完整 locale
              支援的 libc 环境下,它其实是等价 於 include , 但若在其他
              环境, Xlocale.h 会用 XLOCALE 机制来 取代原有的机制。  
              上头的 XSetLocaleModifiers 会存环境变数 XMODIFIERS 中取得
              X-modifier 的值并加以设定之。 XMODIFIERS 的格式为:  
        
                 export XMODIFIERS='@category=value'
        
              目前 category 只有 "im" 有用,如 "@im=xcin-cxims", 意指设
              定 xcin-cxims 作为此 X Window 程式的 XIM server。  
         
           2.设定 fontset (详见 man XCreateFontSet):  
         
              以往 X Window 程式都是呼叫 XLoadQueryFont() 之类的函式来
              载入并使用字型。 但在 Xi18n 的架构下,一个 locale 的
              encoding 通常不能光用一种字型来表示。 例如我们的
              zh_TW.Big5, 半形字需用英文字型 (如 -*-iso8859-1),而全形
              字需 用中文字型 (如 -twmoe-*-big5-0), 因此,我们不能用
              XLoadQueryFont() 将这 些字型分别载入,而要用
              XCreateFontSet() 来载入所需的 fontset。  
        
              Display *display;
              XFontSet fontset;
              char *fontset_name, **missing_charset, *def_string;
              int missing_charset_count;
         
              fontset_name = "-*-iso8859-1,-twmoe-*-big5-0";
              fontset = XCreateFontSet(display, fontset_name,
                        &missing_charset_list, &missing_charset_count,
                        &def_string);
        
              在这□我们可以将 fontset 看成一个「字型物件」,而不要把它
              看成 "-*-iso8859-1" 与 "-twmoe-*-big5-0" 这两种字型的组
              合。当我们要画任何字 串时,我们不用担心要画的到底是全型字
              或半型字,使用 fontset 便能帮我们 处理一切。  
        
           3.画出字串 (详见 man XwcDrawImageString, man
              XmbDrawImageString, manXOpenOM)  
        
              平常我们要在视窗画字串时,都会用 XDrawImageString() 等函
              式,或者用 XDrawImageString16() 来画双位元的字串 (即全型
              字)。现在可以我们用 XwcDrawImageString (用来画 wide-char
              (wchar_t *) 字串) 或 XmbDrawImageString (用来画
              multi-byte (char *) 字串) 。不管您输入的字 串是全型或半
              型,或二者的混合,使用者两个函式都能正确处理,同时会根据
              您的 fontset 的设定来画字。  
        
              除此之外, X11R6 还有一个 Output Method 机制,用来做多国
              语系字串输出 (画字串),我们可以在程式中呼叫 XOpenOM() 来
              开启一个 Output Method 。 但这部分我还没有仔细研究,有兴
              趣的朋友可以参考本章开头所列的参考资料 以获得进一步资讯。
        
           4.XIM (详见 man XOpenIM)  
        
              XIM 应分两方面来谈,一是 XIM server, 另一是 XIM client。
              对 XIM client 而言,如同 Output Method 一般,我们可以在程
              式中呼叫 XOpenIM() 来开启一 个 Input Method, 同时指定 XIM
              server 的名字。但这部分我还没有仔细研究, 有兴趣的朋友可
              以参考本章开头所列的参考资料。  
        
              我目前是在写 XIM server 的部分,但我没有直接拿 X Window
              的函式来写,而 是拿 IMdkit lib 来写,以简化整个程式写作。
              在此我不多作说明了,有兴趣的 朋友可以抓取:  
        
              xcin-2.5-19990218.tar.gz  
        
              回去看,□头的 doc/programming/ 目录中有对此稍作说明,同
              时 IMdkit 的 source 也整个附在 xcin-2.5 source 中。  
        
              以上资料,仅供参考,欢迎大家指教。

TOP