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实例化时?
在浏览了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构造,打印出原始字符串都能得到正确的结果.