コード化け問題の概要
Qt を使用すると、中国語の文字化け、qDebug 印刷ログの文字化け、ウィジェット インターフェイスの文字化けなどの問題がよく発生します。
その理由は主に MSVC コンパイラの使用の問題によるもので、Qt に付属の MinGW には一般にコード化けの問題はありません。
その主な理由はエンコーディングの問題、つまり UTF-8 と GBK エンコーディングの永遠の困難な問題によるものです。
MSVC コンパイラを使用して中国語を出力する際の問題
MSVC コンパイラを使用して Qt Creator でプロジェクトをコンパイルする場合、適切に処理しないと中国語文字列の文字化けが発生しやすくなります。
たとえば、プログラムを実行すると、LabInfo で表示される漢字が文字化けします。
void MainWindow::Changed()
{
QString str="测试";
ui->LabInfo->setText(str);
}
これは、Qt Creator によって保存されたファイルが UTF-8 エンコーディング (あらゆるプラットフォームおよびあらゆる言語で使用できるクロスプラットフォーム文字セット) を使用しているためです。MSVC コンパイラーは通常、 BOM を使用して UTF-8 エンコードされたソース ファイルをコンパイルできますが、生成された実行可能ファイルのエンコーディングは、GBK2312 などの Windows ローカル文字セットです。
つまり、実行ファイルでは文字列はGBK2312 でエンコードされています“测试”
が、実行プログラムがこのステートメントを実行すると文字列はUTF-8 でデコードされるため、文字化けが発生します。
解決
純粋な Qt 環境
この問題を解決するには 2 つの方法があります
QStringLiteral()
1 つはマクロまたはカプセル化された文字列を使用する方法でQString::fromLocal8Bit()
、もう 1 つは MSVC コンパイラによって生成された実行可能ファイルに UTF-8 エンコードを使用するように強制する方法です。
1. オプション 1
QStringLiteral(str) マクロは、コンパイル中に文字列 str から文字列データを生成し、コンパイルされたファイルの読み取り専用データ セグメントにそれを保存します。プログラムが実行時にこの文字列を使用するときは、文字列データを読み出すだけで済みます。できる。
したがって、プログラム内で QStringLiteral() マクロを使用して、各中国語文字列をカプセル化する必要があります。コードは次のように変更できます。
QString str = QStringLiteral("测试");
欠陥:
中国語を含む各文字列はカプセル化する必要があり、tr() 関数は使用できません (国際翻訳の要件がなければ無視できます)。
オプション II
MSVC コンパイラに UTF-8 エンコーディングを使用して実行可能ファイルを生成させるには、中国語の文字列を使用する各ヘッダー ファイルとソース プログラム ファイルの前に次のステートメントを追加する必要があります。
#if _MSC_VER >= 1600 //VS2015>VS>VS2010, MSVC VER= 10.0 -14.0
#pragma execution_character_set("utf-8")
#endif
VS 2010 ~ VS 2015 Update2のコンパイラは、コンパイルされた実行可能ファイルを UTF-8 でエンコードするこのスキームを使用できます。これにより、QStringLiteral()マクロを使用しなくなっても、プログラム実行時に漢字化けが発生することはなくなります。さらに、tr() 関数を使用して文字列を翻訳することもできます。
個人的には、最善の解決策は次のとおりだと思います。
proファイルを追加
msvc{
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}
または
msvc{
QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}
実行文字セットは実行文字セットを表します。source-charset はソース コードの文字セットを表します。
どちらの方法も使用できます。
注:msvc
小文字である必要があります。個人的なテストでは、大文字はMSVC
無効です。また、実行前に、以前のキャッシュをクリアし、再構築し、削除することをお勧めします。
VS +Qt環境のエンコード問題の解決
基本的にはテキストもコンパイラもGBKエンコードされているので文字化けは起こりません。ただし、クロスプラットフォームの互換性を高めるために、UTF-8 エンコーディングに変更する場合は、いくつかの変更を加える必要があります。
- まず、テキストを UTF-8 形式に設定する必要があります
が、ここでは紹介しません。具体的な解決策については、VS2019 エンコーディングの問題、UTF-8 に完全に変更する方法を参照してください。 - 「プロジェクトのプロパティ」-「C/C++ コマンドライン」-「その他のオプション」の下に追加します。
/utf-8
このテストでは、VS2019 を使用すると、純粋な Qt ソリューション 2 の _MSC_VER マクロでも文字化けの問題を解決できることがわかりました。
参考リンク