8

我开始在 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在实例化 no 时 QString 不能正确处理特殊字符?

4

1 回答 1

8

在浏览了 Qt 的源代码之后,我偶然发现了这段代码叫做 whenQCoreApplication被构造:

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

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

当我在 Linux 系统上测试你的代码时,我遇到了和你一样的结果。在 Windows 系统上,注释掉QCoreApplication结构对结果没有影响。我还注意到,printf无论是否QCoreApplication构造,打印出原始字符串都会给出正确的结果。

于 2012-10-04T17:02:58.863 回答