2012-10-04 4 views
7

私は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で特殊文字が正しく処理されないのはなぜですか?

+0

おもしろい質問...私はその理由が 'QTextCodec'または' QTextStream'の中にあるかもしれないと思いますが、私は間違っているかもしれません。 'QDebug'は' QTextStream'を使いますが、あなたが気付いたように '' qPrintable'(これは '.toLocal8Bit()。constData()'の略語です)は既に非ASCII文字を削除したり、 '\ 0''これは、なぜ 'strlen'が1を返すのかという唯一の説明だからです。 – leemes

+0

他の文字列を' 'aaa''としてテストしたので、 ''\ 0'''を挿入することはできません。特殊文字の後に。それらは削除されません。言い換えれば、 's'が' 'aaa''なら' QCoreApplication'を使わないときの出力は '' aa "'です。 – Misch

答えて

7

Qtのソースコードを通過した後、私はQCoreApplicationが構築されたときに呼び出され、このコードに出くわし:つまり

#ifdef Q_OS_UNIX 
    setlocale(LC_ALL, "");    // use correct char set mapping 
    qt_locale_initialized = true; 
#endif 

を、「UNIX」システムでは、QCoreApplicationコンストラクタはsetlocaleへの呼び出しを行っている(ましたin locale.h)、プログラムの現在のロケールを設定するために使用されます。最終的にはQTextStreamに依存するqDebugの出力に影響します。QTextStreamは最終的にシステム定義のロケールと考えられるものを使用して出力を作成します。

Linuxシステムでコードをテストしたところ、同じ結果が発生しました。 Windowsシステムでは、QCoreApplication構成のコメントアウトは結果に影響を与えませんでした。 で元の文字列を印刷すると、QCoreApplicationが構築されたかどうかにかかわらず正しい結果が得られたことにも気付きました。

+0

これはバグですか?Qtは他のQtコンポーネントやクラスを使う前に 'Q(Core)Application'を初期化しなければならないと指定していますか? – Misch

+0

@ミッシュQtは、Q(コア)アプリケーションを初期化する必要がある条件を指定します。 http://qt-project.org/doc/qt-4.8/qcoreapplication.htmlを参照してください。この特定の動作は、「ロケールの設定」セクションに記載されています。 –

関連する問題