[ZZ]关于Qt程序支持中文方法的总结


今天看到XClinux老大的给力的帖子,详细的总结了在qt中支持中文的各种方法。感觉非常给力啊~转帖在这里。看能不能什么时候补充一些自己的例子和图片啊~

在论坛里看到很多网友对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/libqt4/plugins/codecs/qcncodecs.so.4,Symbian环境安装qt- installer.sis,meego环境已自带,其它环境未测试过)。不过,如果做中文平台下的程序,似乎避免不了的,所以总是将这个插件带上吧。至 于插件如何加载,后面再说。
  4. 如果想在源程序文件中直接使用中文,那么需要如下几步:
    1. 确保qcncodecs插件在运行时能正确加载,因为要靠它来转换中文字符串。
    2. C++源代码使用GBK编码来编写。编程中常用的编码无外乎两种,即GBK、UTF-8,这里推荐使用GBK,是由于要兼容编译器的原因,因为 UTF-8文件有BOM头的问题,不同的编译器(msvc、gcc)对其默认处理不同,而使用GBK编码,则编译行为就一致了。考虑到有些编译器比这还麻 烦,只支持latin1,那只有使用1中所介绍的方法了。
    3. 在main()函数Qt(Core)Application对象创建之后,加入下面的代码: [cpp]QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));[/cpp]

      其实无论如何,这些字符串最后都转换成了unicode的了,Qt内部使用的编码。注意,这里不推荐将GBK换成System,因为System,在 Windows下,它会返回cp936,在日文windows系统下,那根本就不对路。在大多数Linux下,使用的是UTF-8,也不对路。所以,为稳 妥起见,请使用“GBK“。

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

      上面的那个../plugins即是指向你的插件所在目录(所有的插件放在哪个目录下,是相对于可执行文件所在目录),有了这个还不够,还要在main()函数中加入下面的设置当前路径的代码,因为qt.conf中的那个Prefix=.要指定到当前目录的:

      [cpp]QDir::setCurrent(QApplication::applicatoinDirPath(""));[/cpp]

  6. 对于Qt Quick中的.qml文件和Qt Script使用的.js文件,最好还是使用UTF-8编码。
经过以上内容的介绍,大家应该对Qt软件发布有所了解了吧?或许若干年后,Qt库都内置到了各个平台下或有了像qt-installer.sis那样的布署包了,那时,我们就不用像现在这样老碰到布署难题了吧。
comments powered by Disqus