我开始在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不能正确处理特殊字符?
QTextCodec
或QTextStream
之中,但我也可能错了。QDebug
使用一个QTextStream
,但正如你所观察到的,qPrintable
(它只是.toLocal8Bit().constData()
的简写形式)已经神奇地删除了你的非 ASCII 字符或插入了一个'\0'
,因为这是strlen
应该返回1的唯一解释。 - leemes'\0'
不是问题,因为我已经测试了其他字符串,如"aäa"
,其中特殊字符后面跟着其他字母。它们不会被删除。换句话说,如果s
是"aäa"
,则在不使用QCoreApplication
的情况下输出为"aa"
。 - Misch