Qt 中文乱码

使用 Qt 经常可能遇到中文乱码的问题,这里介绍一下 Qt 中文窗口和路径乱码的解决方法。我的环境是 Qt5.2 VS2012 Windows8.1 64bit。

Qt 中文乱码原因

关于 Qt 中文乱码的原因以及在 Qt4 中解决中文乱码问题,推荐参考博文:qt中文乱码问题

Qt4 中 QTextCodec 的很多函数在 Qt5 中都没有了,因此适用与 Qt4 的解决方法对 Qt5 无效。具体可以查看 Qt 的官方文档:
Qt4
Qt5

Qt5 中文乱码解决

下面分别介绍无 BOM UTF-8、有 BOM UTF-8 和 GBK 编码下 Qt 窗口、路径以及 cout 输出中文路径乱码的解决方法。

  1. 无 BOM UTF-8
  2. 由于 Qt5 内部使用 Unicode 编码,对于无BOM UTF-8 编码的源文件,可以直接使用字符串而不需特殊转换。
    测试程序如下:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QMessageBox>
    #include <QFileDialog>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      MainWindow w;
      w.setWindowTitle("无BOM UTF8 中文标题");
      w.show();
      QString dir = QFileDialog::getExistingDirectory(&w);
      cout << dir.toLocal8Bit().data() << endl;
      QMessageBox::information(0, "MessageBox 文件路径", dir);
    
      return a.exec();
    }
    

    程序运行结果如下图:
    无BOM UTF-8

  3. 有 BOM UTF-8
  4. 对于带 BOM 的 UTF-8 文件,可以使用 QString::fromLocal8Bit 的方法解决乱码问题,测试程序如下:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QMessageBox>
    #include <QFileDialog>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      MainWindow w;
      w.setWindowTitle(QString::fromLocal8Bit("有BOM UTF8 中文标题"));
      w.show();
      QString dir = QFileDialog::getExistingDirectory(&w);
      cout << dir.toLocal8Bit().data() << endl;
      QMessageBox::information(0, QString::fromLocal8Bit("MessageBox 文件路径"), dir);
    
      return a.exec();
    }
    

    程序运行结果如下图:
    有BOM UTF-8

  5. GBK
  6. 对于 GBK 编码的文件,同样可以使用 QString::fromLocal8Bit 的方法解决,测试程序如下:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QMessageBox>
    #include <QFileDialog>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      QApplication a(argc, argv);
      MainWindow w;
      w.setWindowTitle(QString::fromLocal8Bit("GBK 中文标题"));
      w.show();
      QString dir = QFileDialog::getExistingDirectory(&w);
      cout << dir.toLocal8Bit().data() << endl;
      QMessageBox::information(0, QString::fromLocal8Bit("MessageBox 文件路径"), dir);
    
      return a.exec();
    }
    

    程序运行结果如下图:
    GBK

      对于 Qt5 中的 QTextCodec 貌似并不能解决乱码问题,测试程序如下:

      #include "mainwindow.h"
      #include <QApplication>
      #include <QMessageBox>
      #include <QFileDialog>
      #include <iostream>
      #include <QTextCodec>
      using namespace std;
      
      int main(int argc, char *argv[])
      {
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
        QApplication a(argc, argv);
        MainWindow w;
        w.setWindowTitle("GBK 中文标题");
        w.show();
        QString dir = QFileDialog::getExistingDirectory(&w);
        cout << dir.toLocal8Bit().data() << endl;
        QMessageBox::information(0, QString::fromLocal8Bit("MessageBox 文件路径"), dir);
      
        return a.exec();
      }
      

      程序运行结果如下图:
      QTextCodec 设置编码


      关于 Qt 中文乱码的问题就简单介绍到这里,有任何问题或建议欢迎在下面的评论框中留言共同探讨。thx

      Tagged on: ,

      发表评论

      电子邮件地址不会被公开。