使用UTF-8编码格式时,qt应用程序在Windows上以乱码显示中文

时间:2019-05-13 05:55:31

标签: windows qt cmd utf-8 chinese-locale

我在Windows上开发了一个简单的qt应用程序,以测试qt中文UTF-8编码格式:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:");
    qDebug() << strMessage;
    return a.exec();
}

,我的main.cpp文件编码格式是UTF-8,没有BOM,但是当我在Windows上运行该应用程序时,该应用程序的打印字符串是“鎴戞槸UTF8缂栫爜镄勬枃浠讹细”,我期望是“我是UTF8编码的文件:”,似乎字符串“我是UTF8编码的文件:”已转换为GB2312编码格式,因此显示了错误的字符串“鎴戞槸UTF8缂栫爜镄勬枃浠讹细”在运行时,字符串“我是UTF8编码的文件:”显示正确的字符串“我是UTF8编码的文件:”,当应用程序在macOS上运行时,我不知道为什么? 如何在Windows平台上正确显示字符串“我是UTF8编码的文件:”,非常感谢!

1 个答案:

答案 0 :(得分:1)

在Windows上,将UTF-8打印到控制台不是自动的。您需要首先在控制台中执行以下命令以更改为代码页65001(即UTF-8 Windows代码页):

chcp 65001

您还需要设置提供中文字符的字体。在Windows 10上,这是“ NSimSun”字体。但是,Windows控制台具有简洁的功能,如果您设置了中文代码页(如936),它将自动切换字体。因此,您实际上可以使用标准库system()函数以编程方式运行这些命令。 chcp命令虽然会产生输出。要隐藏它,请将输出重定向到nul

#include <cstdlib>

// ...

int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
    // Temporary codepage change so we get an automatic font change.
    system("chcp 936 > nul");
    // Change to UTF-8.
    system("chcp 65001 > nul");
#endif

    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QString strMessage = QString::fromUtf8("我是UTF8编码的文件:");
    qDebug() << strMessage;
    return a.exec();
}

(作为一个附带说明,您应该使用QString::fromUtf8(),因为您知道该文本为UTF-8。)