首页| 论坛| 消息
主题:关于Qt4程序支持中文方法的总结
XChinux发表于 2011-06-14 16:29
看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。请务必注意,只适用于Qt4。

在论坛里看到很多网友对Qt程序支持中文方面不停地发问,经年累月,我记的这个问题好多年前就已经在论坛有帖子给出过答案了,或者有网友已经在自己的博客中给出了标准答案,直到现在仍然有人不停地问,这里我总结一下(只涉及到windows、x11/linux、meego、symbian平台)。

1、如果程序要支持多国语言,那程序最好全部使用latin1编码(只是最好,并没说只能),在代码中使用Qt的tr()机制,最后做统一的翻译工作,用lupdate工具生成.ts翻译文件,用linguist或任意文本编辑器进行翻译,最后用lrelease工具生成.qm文件,在程序中用QTranslator进行加载。

2、如果想要程序中的一些标准对话框、标准右键菜单等也显示中文,那么需要加载qt_zh_CN.qm文件,它是Qt官方对Qt库中一些文字的中文翻译,最明显的比如QMessageBox上的"OK"、"Cancel"按钮,QLineEdit编辑框上点击右键弹出的"Copy"、"Paste"、"Select All"等菜单项,想让它们变成中文,只要在程序中用QTranslator加载qt_zh_CN.qm文件即可(qt_zh_CN.qm在Qt安装目录下的translations目录下,如果没有,请用lrelease工具从qt_zh_CN.ts文件生成),对于其它语言的Qt库文字翻译,同理,都在Qt安装目录下的translations目录下。如果用到了一些其它Qt组件,也需要翻译的话,比如QtDesignerClient、QtAssistantClient,它们的翻译文件也在translations目录下(Qt SDK中集成的好像没有,可以找Qt源代码包下载来找)。

3、如果在程序中,需要对GBK编码(包括GB2312、GBK、GB18030,也叫cp936)字符串进行转换(成unicdoe、UTF-8等),那么就需要加载插件qcncodecs(在Windows下在Qt安装目录下的plugins/codecs/qcncodecs4.dll,Linux下在/usr/lib/qt4/plugins/codecs/qcncodecs.so.4,Symbian环境安装qt-installer.sis,meego环境已自带,其它环境未测试过)。不过,如果做中文平台下的程序,似乎避免不了的,所以总是将这个插件带上吧。至于插件如何加载,后面再说。

4、如果想在源程序文件中直接使用中文,那么需要如下几步:
a、确保qcncodecs插件在运行时能正确加载,因为要靠它来转换中文字符串。
b、C++源代码使用GBK编码来编写。编程中常用的编码无外乎两种,即GBK、UTF-8,这里推荐使用GBK,是由于要兼容编译器的原因,因为UTF-8文件有BOM头的问题,不同的编译器(msvc、gcc)对其默认处理不同,而使用GBK编码,则编译行为就一致了。考虑到有些编译器比这还麻烦,只支持latin1,那只有使用1中所介绍的方法了。
c、在main()函数Q(Core)Application对象创建之后,加入下面的代码:
QTextCodec::setCodecForCStrings(QTextCoec::codecForName("GBK"));
其实无论如何,这些字符串最后都转换成了unicode的了,Qt内部使用的编码。注意,这里不推荐将GBK换成System,因为System,在Windows下,它会返回cp936,在日文windows系统下,那根本就不对路。在大多数Linux下,使用的是UTF-8,也不对路。所以,为稳妥起见,请使用“GBK“。

5、程序发布时,可能会产生中文乱码问题,归根到底是因为无法进行中文编码转换的原因,也就是无法找到qcncodecs插件的原因,那只要正确的将它找到就行了。那如何发布?它分为两种情况:
    a、系统中已经有了Qt4环境,无论是系统自带的,还是有专有的Qt4安装包的,那发布时就不用考虑Qt库及插件的问题了,它会自动根据系统环境变量找到的。这适用于Linux(许多Linux都自带了Qt4库)、MeeGo(已经自带了Qt4库)、Symbian(Symbian^3内置了Qt库,S60v3、v5等,则需要安装qt-intaller.sis,同样也不需要自己的程序做专门的布署)。
b、系统中没有Qt4环境,也没有专有的Qt4安装包,那就自己程序打包时自带Qt库和插件吧。在Windows下,将所依赖的dll库直接放在.exe文件所在目录下,在linux下,将它们放在一个lib目录下,通过写启动脚本设置LD_LIBRARY_PATH来让可执行程序来找到它。关于插件,我推荐使用qt.conf的方式,写一个qt.conf文件,将它放在资源文件中的:/qt/etc/qt.conf路径上,或者直接放在可执行文件所在目录下,其内容如下:
Prefix=.
Libraries=../lib
Binaries=../bin
Plugins=../plugins
上面的那个../plugins即是指向你的插件所在目录(所有的插件放在哪个目录下,是相对于可执行文件所在目录),
有了这个还不够,还要在main()函数中加入下面的设置当前路径的代码,因为qt.conf中的那个Prefix=.要指定到当前目录的:
QDir::setCurrent(QApplication::applicatoinDirPath());

在Windows下,如果不想写qt.conf文件,那可以直接
下一页 (1/2)
回帖(41):
41楼:顶顶
40楼:顶一个
39楼:给力

全部回帖(41)»
最新回帖
收藏本帖
发新帖