16

これは明らかな質問のように聞こえるかもしれませんが、UTF-8がどのようにエンコードされているか、またはtoUtf8関数がどのように機能するかについて何かが欠けています。

非常に単純なプログラムを見てみましょう

QString str("Müller");
qDebug() << str << str.toUtf8().toHex();

次に、出力を取得します

"Müller" "4dc383c2bc6c6c6572" 

しかし、文字üはc383c2bcではなくc3bcとしてエンコードされるべきであるという考えが浮かびました。

ありがとうヨハン

4

2 に答える 2

19

ソースコードのエンコーディングによって異なります。

私はあなたのファイルがすでにUTF-8でエンコードされていると思う傾向があり、文字üはC3BCとしてエンコードされています。

http://doc.qt.io/qt-4.8/qstring.html#QString-8によると、デフォルトで考慮されるQString :: fromAscii()メソッドを使用して文字列をUnicodeに変換するQString::QString ( const char * str )コンストラクターを呼び出しています。Latin1コンテンツとしての入力。

C3とBCはどちらもラテン語1で有効であるため、それぞれ√と¼を表します。これらをUTF-8に変換すると、次の文字になります。

Ã(C3)-> C3 83

¼(BC)-> C2 BC

これにより、次の文字列が表示されます: "4d c3 83 c2 bc 6c 6c 65 72"

要約すると、これはダブルUTF-8エンコーディングです。

この問題を解決するためのいくつかのオプションがあります。

1)お気に入りのテキストエディタを使用して、ソースファイルをLatin-1に変換できます。

2)リテラル文字列の\ xFCにü文字を適切にエスケープできるため、文字列はファイルのエンコーディングに依存しません。

3)ファイルと文字列をUTF-8データとして保持し、使用できますQString str = QString::fromUtf8 ("Müller");

更新:この問題はQT5では関連しなくなりました。http://doc.qt.io/qt-5/qstring.html#QString-8は、コンストラクターがQString::fromUtf8()の代わりに内部的に使用するようになったと述べていQString::fromAscii()ます。したがって、UTF-8エンコーディングが一貫して使用されている限り、デフォルトで使用されます。

于 2011-01-31T16:51:44.430 に答える
2

コードを実行すると、期待どおりの結果が得られます

"4dc3bc6c6c6572"

問題は、出力ではなく入力にあると思います。ソースファイルのエンコーディングを確認して、 void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]

于 2011-01-31T16:47:46.160 に答える