Qt 为什么';当没有实例化QCoreApplication时,t QString是否正确处理特殊字符?
我开始用Qt编写一个非常基本的文本操作应用程序,没有GUI。 我的文本包含特殊字符,但不知何故,无论我怎么做,我都无法打印这些特殊字符。 然后我注意到,在添加一个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”);//
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(核心)应用程序的条件。请参阅。此特定行为在“区域设置”部分中有说明。