linux显示程序开发,浅谈Linux 下的中文程序开发

本文介绍如何在Linux环境下使用Qt进行中文程序开发,包括程序国际化(i18n)、中文显示及中文输入处理等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈Linux 下的中文程序开发

[日期:2007-08-05]

来源:Linux公社

作者:Linuxidc

[字体:大 中 小]

代码:

/* 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< } 0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值