4

この文字(' ß ')を含むastd::stringをaに変換しようとすると、は「 Ã」または他の本当に奇妙な文字のようなものに変わります。どうしたの?このコードを使用しましたが、エラーや警告は発生しませんでした。QStringQString

std::string content = "Heißes Teil.";
ui->txtFind_lang->setText(QString::fromStdString(content));

このstd::stringキャラクターには問題ありません。問題なくテキストファイルに書き込んだこともあります。だから私は何が間違っているのですか?

4

2 に答える 2

6

コーデックをUTF-8に設定する必要があります:

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

デフォルトでは、QtはLatin-1エンコーディングを使用しますが、これは制限されています。このコードを追加することにより、デフォルトのエンコーディングをUTF-8に設定し、より多くの文字を使用できるようにします。

于 2013-03-22T20:33:38.353 に答える
1

アントヨの答えはうまくいきましたが、理由はよくわかりませんでした。そこで、調査することにしました。

ほとんどのWebページと同様に、私のドキュメントはすべてUTF-8でエンコードされています。文字のßUTFコードポイントはUTF+00DFです。

UTF-8は可変長エンコーディングであるため、バイナリ形式では、またはßとしてエンコードされます。デフォルトでは、QtはLatin1エンコーディングに依存しているためです。2つの異なる文字として読み取られます。Latin1は128〜159(10進数)のバイトを認識しないため、最初のものはにマップされ、2番目のものは何にもマップされません。11000011 10011111C3 9FßC3Ã9F

そのため、Latin1エンコーディングを使用している場合と同じようにß表示されます。Ã


補足:UTF-8エンコーディングがどのように機能するかをブラッシュアップすることをお勧めします。そうしないとß、コードポイントDFが1バイト未満でFFあり、1バイトしか消費しない場合でも、2バイトかかるのは少し直感的ではないようです。

于 2013-03-23T15:12:44.313 に答える