浅谈Linux 下的中文程序开发(2)

代码:
/* main.cpp */

#include
#include "chinese.h"

main (int argc, char **argv)
{
QApplication a(argc, argv);
Chinese w;
a.setMainWidget (&w);
w.show();
return a.exec();
}



这个就不多说了.是 chinese 的 main 程序.用来显示 chinese 的.

然后建立一个如下的 Makefile:
代码:
INCL= -I$(QTDIR)/include -I/usr/include/kde
CFLAGS= -pipe -O2 -fno-strength-reduce
LFLAGS= -L$(QTDIR)/lib -L$(KDEDIR)/lib -L/usr/X11R6/lib
LIBS= -lkdecore -lkdeui -lqt -lX11 -lXext -ldl
CC=g++
MOC=moc

chinese: chinese.moc chinese.o main.o
$(CC) $(LFLAGS) -o chinese chinese.o main.o $(LIBS)
chinese.moc: chinese.h
$(MOC) chinese.h -o chinese.moc
main.o: main.cpp
chinese.o: chinese.cpp

clean:
rm -f *.o
rm -f *.bak
rm -f *.moc
rm -f chinese

.SUFFIXES: .cpp .h

.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $<



通 过 make 指令.我们就可以 build 出一个可执行的文件 chinese 执行 ./chinese 可以看到我们的小程序. 我们在程序中那个可以输入的地方,随便打些东西进去(请输入英文)然后按 enter 键. 我们就会看到我们在程序中输入的那些东西会被显示在我们的 X 终端模拟中.

但是目前这个程序既不能显示中文,同样的也不能接受中文输入. 不相信的话,您可以尝试在那个输入文字的地方打入随便几个中文. 例如 "中文测试" 然后按 Enter 键.您会发现 X 终端模拟中显示的只有 "??" 之类的东西. 原因后面会讲到.

首先,我们第一部需要的是让我门的程序显示中文.相信大家一定都知道, QT 中已经帮我们做好了 i18n 了.只要去用就好. 首先我们需要在 chinese.h 的文件中加入:
#include qtranslator.h 是给 QTranslator 用的 include 文件. 然后在 chinese.cpp 中 Chinese::Chinese 需要改成下面的样子:
代码:
Chinese::Chinese()
{
resize(200,100);
QTranslator translator(this);
translator.load("chinese", ".");
qApp->installTranslator(&translator);

label=new QLabel(tr( "Input Line:"), this);
label->setGeometry(10,10,90,30);

input=new QLineEdit(this);
input->setGeometry(10, 40, 180, 30);
input->setFocus();
connect(input, SIGNAL(returnPressed()), this, SLOT(display()));

}



首 先,我们定义了 QTranslator translator 在 this. 然后 translator.load 去载入 chinese.qm 这个文件.这里 .qm 这个全名称我们是不需要的. QT default 就会去找 .qm 了. 所以虽然我们的中文对应的翻译文件全名是 chinese.qm ,但是我们这里只需要打入 chinese 就好了.

qApp->installlTranslator(&translator)就会帮我们把翻译成中文的信息, 加载我们的程序中.

同 时, label=new QLabel("Input Line:", this) 要改成下面这样 label=new QLabel(tr( "Input Line:"), this) 这里的 tr 是代表信息需要翻译 (translator)的意思. tr 也是给 findtr 来寻找哪里需要信息翻译的一个标志 (flag)

现在用 make 重新编译我们的程序. 编译完后,我们还需要做出 qm 文件来给 QTranslator 用.

首先,我们需要用到 findtr3 这个程序. findtr3 会帮我们找出程序中所有用到 tr 的地方.同时帮我们自动产生 po 文件.
findtr3 chinese.cpp > chinese.po
现在用您最喜爱的文字编辑器(vim, emacs, joe or other)打开 chinese.po 这个文件,我们会看到:
代码:
# This is a Qt message file in .po format. Each msgid starts with
# a scope. This scope should *NOT* be translated - eg
# from French to English, "Foo::Bar" would be translated to "Pub",
# not "Foo::Pub".
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2002-06-22 20时09分00秒 EDT\n"
"PO-Revision-Date: YYYY-MM-DD\n"
"Last-Translator: FULLNAME \n"
"Content-Type: text/plain; charset=iso-8859-1\n"

#: chinese.cpp:15
msgid "Chinese::Input Line:"
msgstr ""



这 里 findtr3 帮我们找到,在 chinese.cpp 这个程序中的第 11 行,有一处用到 tr 的地方. 而 tr 后面的内容是 Input Line: 还记得我们的 label 是怎么写的吗? label=new QLabel(tr( "Input Line:"), this); 没错, 这里找到的就是 "Input Line:" 这几个字. 下面我们开始翻译 po 文件了

我们真正需要动到的只有两个地方,就是:
"Content-Type: text/plain; charset=iso-8859-1\n"
和下面的 msgstr "" 就足够了.

代码:

#: chinese.cpp:15
msgid "Chinese::Input Line:"
msgstr ""



首先我们需要设定我们是用哪种于言编码来翻译 po 的.同时 qt 也会用这种语言编码来显示我们所翻译的信息.所以我们需要改成:
代码:
"Content-Type: text/plain; charset=big5\n"

或者:
代码:
"Content-Type: text/plain; charset=gb2312\n"



其中 big5 是繁体中文所以用的编码, gb2312 (GBK) 则是简体中文所使用的.

接下来,我就需要更改 msgstr 了:
msgid "Chinese::Input Line:"
msgstr "请输入中文:"

Tips: 注意,如果您是用 gb2312 简体来输入的那么 您需要在 charset 中选择 gb2312. 同样的, big5 繁体输入,就需要选择 charset=big5 您不能用同一种编码的输入法,同时去写两 个 po 文件. 也就是说,不能用 xcin 的繁 体输入,同时去翻译 gb2312 的 po. 也不 能用 chinput 的简体输入来翻译 big5 的 po. 如果您需要同时翻译繁体,简体的 po 那么建议您用您所熟习的语言环境翻译好 一份出来,然后用 big5<=>gb 的转码工具 转出另外一个编码的po文件来.同时记得更 改所转出来的文件中的 charset
当然,如果您愿意,也可以把
"PO-Revision-Date: YYYY-MM-DD\n"
"Last-Translator: FULLNAME \n"
加入适当的信息
PO-Revision-Date: 加入您翻译的信息
Last-Translator: 加入您的个人信息以及 e-mail
"PO-Revision-Date: 2002-06-22\n"
"Last-Translator: Goldencat \n"


然后存盘,退出.先在我们还需要最后一步,就是把 chinese.po 文件转成 chinese.qm 的格式给程序来读.这时侯我们就用到了一只叫做 msg2qm2 的程序.
msg2qm2 chinese.po chinese.qm


现在我们就算是完成了. 执行我们的文件 ./chinese 看看,那个 "Input Line:" 已经变成中文的 "请输入中文:" 了.

下一步,我们来解决在 QT 中输入中文,然后把中文显示出来的问题.
Tips: QT 中的中文输入也很重要.写一个程序,不光是 表面上看起来信息都变成中文的,就叫做中文化 了.举一个最简单的例子:现在有一个中文的 MySql 数据库.我们的 QT 程序需要正确的输入 查询中文的数据.这就需要 QT 可以正确无误的 接受并且处理我们的中文输入才可以.
在 QT 中,我们有一个 QTextCodec 可以用. QTextCodec 就是专门来为我们处理不同编码的.

为了使用 QTextCodec 我们首先需要在 chinese.cpp 中,把 qtextcodec.h 给 include 进来.
include
现在来看看我们的 void Chinese::display() 吧.
代码:

void Chinese::display()
{
QString string;
string=input->text();
QTextCodec *codec=QTextCodec::codecForName("big5");
QCString chinese_string=codec->fromUnicode(string);
cout<

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzwdsx.html