gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:36:48 24 4
gpt4 key购买 nike

我开始在 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,后者最终使用它认为是系统定义的语言环境来创建其输出。

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

关于qt - 当没有实例化 QCoreApplication 时,为什么 QString 不能正确处理特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com