8

私はGUIなしでQtで非常に基本的なテキスト操作アプリケーションを書き始めました。私のテキストには特殊文字が含まれていましたが、何をしても、どういうわけかそれらの特殊文字を印刷できませんでした。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が特殊文字を正しく処理しないのはなぜですか?

4

1 に答える 1

8

QCoreApplicationQt のソース コードを確認した後、構築時に呼び出される次のコードに出くわしました。

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

言い換えれば、「Unix」システムでは、QCoreApplicationコンストラクターはプログラムの現在のロケールを設定するために使用されるsetlocale(にある) を呼び出します。これは最終的に からのlocale.h出力に影響を与えます.qDebugQTextStream

あなたのコードを Linux システムでテストしたところ、あなたと同じ結果になりました。Windows システムでは、構造をコメントアウトしてQCoreApplicationも結果に影響はありませんでした。printfまた、構築されているかどうかに関係なく、元の文字列を印刷すると正しい結果が得られることにも気付きましたQCoreApplication

于 2012-10-04T17:02:58.863 に答える