看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。请务必注意,只适用于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路径上,或者直接放在可执行文件所在目录下,其内容如下:
[Paths]
Prefix=.
Libraries=../lib
Binaries=../bin
Plugins=../plugins
上面的那个../plugins即是指向你的插件所在目录(所有的插件放在哪个目录下,是相对于可执行文件所在目录),
有了这个还不够,还要在main()函数中加入下面的设置当前路径的代码,因为qt.conf中的那个Prefix=.要指定到当前目录的:
QDir::setCurrent(QApplication::applicatoinDirPath());
在Windows下,如果不想写qt.conf文件,那可以直接将%QTDIR%/plugins目录下的对应插件拷贝到可执行文件所在目录下,假设可执行文件所在目录为bin,则插件qcncodecs4.dll的路径为bin\codecs\qcncodecs4.dll
6、对于Qt Quick中的.qml文件和Qt Script使用的.js文件,最好还是使用UTF-8编码。
经过以上内容的介绍,大家应该对Qt软件发布有所了解了吧?或许若干年后,Qt库都内置到了各个平台下或有了像qt-installer.sis那样的布署包了,那时,我们就不用像现在这样老碰到布署难题了吧。
看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。