zoukankan      html  css  js  c++  java
  • Codecs是以plugin的形式被调用的(显示中文的codec plugin文件是qcncodecs4.dll),可静态载入和动态载入

    作为非英语国家人员开发的类库,QT有充分的理由优先考虑支持Unicode和各国自定义字库编码。大家也知道了QT对软件Internationalization有一套完整的开发模型,包括专门为此写的linguist程序。但是如果我们的软件只运行在中文系统下,最简单的方法是什么呢?最简单的方法,就是在main函数中调用QTextCodec::setCodecForTr( QTextCodec::codecForName("GBK") );就可以了。记得这句要在所有使用tr的语句前调用。以后在需要使用中文的地方使用tr("中文字符");就可以了。相信许多老MFCer都知道_T("")的用法,tr感觉类似一些,而且以后想做其它语言版本时还可以在linguist程序中翻译。
    但事情真的这么简单吗?当我将一个测试程序拷贝到一台没装过Qt的电脑上时,tr中的字都显示不了了。奇怪的是用Creater IDE生成的UI界面中的汉字能正常显示。看了qmake生成ui的.h文件,发现那些中文字符已经被自动转换成UTF8 encoding了。奇怪的是,QTextCodec::setCodecForTr( QTextCodec::codecForName("GBK") );改为QTextCodec::setCodecForTr( QTextCodec::codecForName("utf-8") );也不行。没办法了,查资料,然后看了源代码。折腾了2个小时终于搞清楚了。
    原来Codecs是以plugin的形式被调用的,显示中文的codec plugin文件是qcncodecs4.dll。里面有QGb18030Codec、QGbkCodec和QGb2312Codec三个类。注意,后两个类是从第一个类派生的,因为它们的字符只是Gb18030的特定子集。GBK和GB2312只是为了兼容旧的系统和软件。大家以后可以直接使用GB18030。这个类真正的“肉”就是巨长的一个编码数组。(这里感谢turbolinux,gnuchina等一些前辈提供了这些编码,详见Qt中的说明)
    既然找到了正主儿,那么问题也就迎刃而解了。将qcncodecs4.dll拷入目标机器的特定路径,如果你开发的电脑Qt安装目为C:/Qt的话,qcncodecs4.dll应该拷入目标电脑的C:/Qt/Plugins/Codecs。运行程序,看到了久违的汉字。
    有没有更好的方法呢?在Qt(Cute)中当然有了:)
    感谢Qt的plugin系统,将qcncodecs4.dll拷贝到运行程序目录下的特定目录,如运行程序完整路径为C:/MyApp/MyApp.exe,那么qcncodecs4.dll应拷贝至C:/MyApp/Plugins/Codecs下,然后在main函数中加入下面的代码:

    QApplication a(argc, argv);

    QString sPath = a.applicationDirPath();
    sPath += QString("/plugins");
    a.addLibraryPath(sPath);

    这段代码将C:/MyApp/Plugins加至plugin的目录list中,制作软件安装程序时将qcncodecs4.dll文件与其它文件一起打包,安装时按ExePath/Plugins/Codecs目录安装即可。
    至此,能想到的问题都搞清楚了,我可以睡觉了。

    PS1:我使用的是最新的Qt 4.6版
    PS2:Debug版本要使用qcncodecsd4.dll,跨平台的就是不一样,MS的大bug在这里不会再坑人了
    PS3:Qt最新的Creater有很大的进步,大家可以试试

    http://blog.csdn.net/superjoel/article/details/5044689

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/findumars/p/5089728.html
Copyright © 2011-2022 走看看