关于Qt显示中文乱码问题

 一直都在代码中使用GBK编码来解决Qt显示中文的问题,即在main()函数中添加下面几句:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

然后在发布的应用程序文件夹下建立plugins\codecs,然后将qcncodecs4.dll放到该目录下,也没再出现乱码。但是后来客户反馈说存在乱码。为什么会出现乱码呢?    

    原来如此。比如写了“汉字”两个字,然后以GBK形式保存在计算机的存储设备中(“汉字”的GBK编码是BA、BA、D7、D6)。然后在读取时,计算机中的二进制码“BA、BA、D7、D6”却不是以同样的GBK形式被解释成“汉字”两个字符。比如说以ISO-88591形式被读取,那么“BA、BA、D7、D6”就会被解释为四个西欧文字了。如果将程序发布到一些非简体中文的国家或地区,可能出现对方的机器上根本没有安装任何中文的编码格式,所以就会出现乱码。

    那么,如何彻底解决乱码问题呢?Qt提供了强大的多国语言工具Qt Linguist。

   一、编写源码:

    实现多语言,1)、首先必须保证每一个用户可见的字符串都使用了tr()函数;2)、在应用程序启动时使用QTranslator载入一个翻译文件(.qm)。如:

#include <QtGui/QApplication>
#include <QTranslator>
#include <QMessageBox>
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    //载入翻译文件
    QTranslator translator;
    bool bLoaded = translator.load("readnv_chs");//语言包文件,由linguist工具生成
 
    if (!bLoaded)
    {
    QMessageBox::warning(NULL,QApplication::tr("Load File Failed"), QApplication::tr("Load readnv_chs.qm Failed!"));
    }
 
    app.installTranslator(&translator);
 
    mainwindow w;
    w.show();
 
    return app.exec();
}

注意:翻译文件加载的位置必须在界面实例化之前完成。编写好代码后:

   二、生成翻译文件:

    1)、在.pro文件中添加TRANSLATIONS+=readnv_chs.ts。指明在项目中生成翻译源文件readnv_chs.ts。<.ts是可读的翻译文件,使用简单的XML格式;而.qm是经过.ts转换而成的二进制机器语言>。

     2)、执行命令:lupdate -verbose xx.pro。从应用程序的源代码中提取所有用户可见的字符串,生成相应的.ts文件(readnv_chs.ts)。

         

 3)、使用Qt Linguist翻译该应用程序。使用linguist打开readnv_chs.ts文件,对tr()函数的字符串参数进行翻译,然后点击release,生成相应的.qm文件,即readnv_chs.qm。然后将.qm文件放在应用程序目录下即可。