QT QString char*中国語の文字化けし問題

1902 ワード

最近、QTプロジェクトでこのような問題が発生しました.
    1.QString変数をchar*変数に変換します.
    2.char*変数をQStringに変換します.
そして、最初のQStringに中国語が含まれていると、得られたchar*変数が文字化けしてしまうことがテストで分かった.
コードの一部は次のとおりです.
main()関数でエンコードを設定するには、次の手順に従います.
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));

QStringをchar*プロセスに変換します.
QString str = " ";
QByteArray temp = str.toLocal8bit();
char *name = temp.data();
qDebug()<

実行後の印刷結果は文字化けして表示されます.
解決方法:
方法1:QStringを標準ライブラリのstringタイプに変換し、次にstringをchar*に変換します.
std::string str = filename.toStdString();
const char* ch = str.c_str();

テストの結果、中国語の文字化けしは現れなかった.
方法2:Qtでは、char*ch変数でインタフェースに表示する場合、まずQStringに変換します.強変換QString(ch)を直接使用すると、結果は文字化けしてしまいます.ただし、次の方法で変換すると問題が解決し、コードは次のようになります.
1.コードの設定:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
2.QStringをchar*プロセスに変換します.
QString str = " ";
QByteArray temp = str.toLocal8Bit();
char *name = temp.data();
qDebug()<

このときqDebug()出力は文字化けして表示されますが、ここのnameが中間変数として一部のインタフェースを呼び出すために使用されている場合は、最後にnameをインタフェース表示のためにQStringに変換する必要があります.では、このname変数の文字化けし問題を無視することができます.最後にnameをQStringに変換したとき、文字化けしないことに注目すればいいだけです.
3.char*をQStringに変換
char name[256];
memset(name,0,sizeof(name));
getFileName(name); // name, 
QString str = QString::fromLocal8Bit(name);  // QString, 。
                                             // QString str = QString(name), 。

そのため、ポイントはtoLocal 8 Bit()とfromLocal 8 Bit()の組み合わせで使用することです.