私はGUIなしで、非常に基本的なテキスト操作アプリケーションをQtで書き始めました。 私のテキストには特殊文字が含まれていましたが、どういうわけか私が何をしてもその特殊文字は印刷できませんでした。 それから、私が以前に削除したQCoreApplication
インスタンスを追加した後、それは必要ないと思ったので、すべてがうまくいったことに気付きました。QCoreApplicationがインスタンス化されていないときに、QStringが特殊文字を正しく処理しないのはなぜですか?
#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
で(すべてはそれが必要として動作します):ここで
QCoreApplication
ラインをコメントアウトした後
"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5
出力(特殊文字ではありませんもう表示されます):
"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
他の文字列を' 'aaa''としてテストしたので、 ''\ 0'''を挿入することはできません。特殊文字の後に。それらは削除されません。言い換えれば、 's'が' 'aaa''なら' QCoreApplication'を使わないときの出力は '' aa "'です。 – Misch