我开始用Qt编写没有GUI的非常基本的文本处理应用程序。
我的文字包含特殊字符,但是无论如何我都无法打印这些特殊字符。
然后我注意到,在添加QCoreApplication实例(我之前已经删除了它,因为我认为我不需要它)之后,一切都按应有的方式工作。

这是代码:

#include <QCoreApplication>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString s(QString::fromUtf8("aä\xc3\xa4")); // aää

    qDebug() << s;
    qDebug() << s.toAscii();
    qDebug() << s.toLatin1();
    qDebug() << s.toUtf8();
    qDebug() << s.toLocal8Bit();
    qDebug("%s", qPrintable(s));

    qDebug("%i", s.length());
    qDebug("%i", strlen(qPrintable(s)));

    return 0;
}


QCoreApplication输出(一切正常):

"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5


注释掉定义了QCoreApplication的行后的输出(不再显示特殊字符):

"a"
"a"
"a"
"a"
"a"
a
3
1


请注意,在调用qPrintabable(s)之后,特殊字符已经被删除。
我对此进行了测试,以确保QDebug不是问题。

我还检查了文件是否真的以UTF-8编码。

为什么在没有实例化QCoreApplication的情况下QString不能正确处理特殊字符?

最佳答案

看完Qt的源代码后,我偶然发现了构建QCoreApplication时调用的这段代码:

#ifdef Q_OS_UNIX
    setlocale(LC_ALL, "");                // use correct char set mapping
    qt_locale_initialized = true;
#endif


换句话说,在“ Unix”系统上,QCoreApplication构造函数正在调用setlocale(可在locale.h中找到),该调用用于设置程序的当前语言环境。这最终会影响qDebug的输出,而QTextStream依赖于QCoreApplication,后者最终使用它认为是系统定义的语言环境来创建其输出。

当我在Linux系统上测试您的代码时,遇到的结果与您相同。在Windows系统上,注释掉printf构造对结果没有影响。我还注意到,不管是否构造了QCoreApplication,通过打印出原始字符串都会得到正确的结果。

09-11 17:31