Qt 为什么';当没有实例化QCoreApplication时,t QString是否正确处理特殊字符?

Qt 为什么';当没有实例化QCoreApplication时,t QString是否正确处理特殊字符?,qt,special-characters,Qt,Special Characters,我开始用Qt编写一个非常基本的文本操作应用程序,没有GUI。 我的文本包含特殊字符,但不知何故,无论我怎么做,我都无法打印这些特殊字符。 然后我注意到,在添加一个QCoreApplication实例(我之前已经删除了它,因为我认为我不需要它)之后,一切都正常工作 代码如下: #包括 #包括 #包括 int main(int argc,char*argv[]) { qcorea应用程序(argc、argv); QString s(QString::fromUtf8(“aä\xc3\xa4”);//

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

代码如下:

#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QString s(QString::fromUtf8(“aä\xc3\xa4”);//aä

qDebug()在浏览了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
的输出,qDebug依赖于
QTextStream
,QTextStream最终使用它认为是系统定义的区域设置来创建其输出


当我在Linux系统上测试您的代码时,我遇到了与您相同的结果。在Windows系统上,注释出
QCoreApplication
结构对结果没有影响。我还注意到,通过
printf
打印出原始字符串,无论
QCoreApplic是否我想原因可能在
QTextCodec
QTextStream
中,但我可能错了。
QDebug
使用了
QTextStream
,但正如您所注意到的,
qPrintable
(这只是
.toLocal8Bit().constData()的缩写)
)已经神奇地删除了非ascii字符,或者插入了一个
'\0'
,因为这是
strlen
应该返回1的唯一解释。插入
'\0'
不是这种情况,因为我已经将其他字符串测试为
“aäa”
,其他字母紧跟在特殊字符之后。它们不会被删除。换句话说,如果
s
的“aäa”
,则不使用
QCoreApplication
时的输出是
“aa”
。那么这是一个错误,还是Qt指定必须初始化
Q(核心)应用程序
在使用其他Qt组件或类之前?@MISH Qt指定必须初始化Q(核心)应用程序的条件。请参阅。此特定行为在“区域设置”部分中有说明。