当没有实例化QCoreApplication时,为什么QString没有正确处理特殊字符?

Mis*_*sch 7 qt special-characters

我开始在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;
}
Run Code Online (Sandbox Code Playgroud)

输出QCoreApplication(一切正常):

"aää" 
"aää" 
"aää" 
"aää" 
"aää" 
aää
3
5
Run Code Online (Sandbox Code Playgroud)

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

"a" 
"a" 
"a" 
"a" 
"a" 
a
3
1
Run Code Online (Sandbox Code Playgroud)

请注意,在调用之后qPrintabable(s),特殊字符已被删除.我测试了这个以确定,这QDebug不是问题.

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

为什么QString没有正确处理特殊字符,当没有QCoreApplication实例化时?

RA.*_*RA. 8

在浏览了Qt的源代码之后,我偶然发现了这个QCoreApplication被构造的代码:

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

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

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