QTextCodec *コーデック= QTextCodec :: codecForName( "UTF-8"); QTextCodec :: setCodecForTr(コーデック); QTextCodec :: setCodecForLocale(QTextCodec :: codecForLocale()); QTextCodec :: setCodecForCStrings(QTextCodec :: codecForLocale());
メイン関数に上記のコードを加えました。
ます。http://f.dataguru.cn/thread-866992-1-1.htmlからの振替
Qtの中国人が文字化けして問題を解決するためのコーディング(UTF-8 / GBK)
Qtの科学の知識の共通コードする2つのエンコーディングは以下のとおりです。UTF-8およびGBK
★8 UTF-:ユニコードTransformationFormat-8ビットは、BOMを含む許可されますが、通常はBOMの自由です。これは、エンコードするためにその英語8(すなわちバイト)、中国の使用24(3バイト)を使用して、国際的マルチバイト文字エンコーディングを解決することです。UTF-8文字が世界のすべての国が国際的なコード、汎用性を使用する必要が含まれています。UTF8キャラクタ・セットのUTF8エンコードの表示テキストは、ブラウザで国を支援することができます。IEは中国を表示することができますたとえば、UTF8エンコーディングならば、英語は外国人に、彼らはIEの中国語サポートパッケージをダウンロードする必要はありません。
★GBKはGB2312の標準と互換性のある国家標準GB2312ベースの拡大です。ダブルバイト文字を表すために使用されている英語かどうかGBKの文字コードは、すなわち、2バイトで表現される、中国語を区別するために、その上位ビットを1に設定されています。GBKはすべて中国語の文字が含まれている、それは国コード、UTF8よりも悪い汎用性である、UTF8は、占有が、データベースは、GBDよりも大きくなっています。GBKは、互換性の拡張GB2312とGB2312追加ですが、それはまた、伝統的な中国、そして日本のカナ表示することができます。
★等GBK、GB2312、UTF8およびユニコード相互に符号化することによって変換されなければならないとの間:
GBK、GB2312 -ユニコード- UTF8
UTF8 - GBK、GB2312 -ユニコード
簡体字中国語ウィンドウシステムで★、GBK / GB2312のANSI符号化表現エンコードは、ANSIは、通常は0x80〜0xFFの漢字を示しレンジに2つのバイトを使用しています。$ 00〜0x7Fの間の文字は、1つのバイトは、まだ文字の代表です。すべての文字をエンコードするのUnicode(UTF-16)は2バイトで表されます。
簡単なQtアプリケーションは、この小さなプログラムは、我々がより親密な感じになりますと推定されます。中国のユーザーの相当数は、このコードを書いしようとしているようだ。
書式#include <QtGui /はQApplication>
#include <QtGui / QLabel> int型のmain(int型ARGC、チャー** ARGV){ はQApplicationアプリ(ARGC、ARGV); QStringのA = "I文字"; QLabelラベル(A); label.show(); 戻りapp.exec(); } コード、保存し、コンパイルし、実行し、すべてがうまくいっているが、それの結果:[TD]
ほとんどのユーザーは見ます
|
他のユーザーが見ます
|
Ö×ÎòêÇoo
|
æ'æ〜AE±‰に -
|
驚くべきことに、中国が画面に表示されませんでした、文字のない理解がありませんでした。だから、検索エンジンで始まるフォーラムに投稿し始めたか、文句
最後に、次の文のいずれかが問題を解決することができると言わ:
QTextCodecは:: setCodecForCStrings(QTextCodec codecForName ::(「GB2312」));
QTextCodec :: setCodecForCStrings(QTextCodec :: codecForName(「UTF-8」) );
一つ一つが実際に解決、しようとする2つの命令(ほとんどのユーザーは、第二)は、他のユーザで、最初のものです。なぜこれがそうですか?
なぜQStringの0は、明確なコンセプト、それを文字化けします:ナロー文字列であるC言語の文字列である「私は漢字がいます」。上記の例では、のように記述することができる
のconstのchar * strの= "私は漢字だ";
QStringのA = STR;
または
;文字列str [] = "私は漢字だ"
QStringのA = STR;
ので、
明確なコンセプト1:ソースファイルがエンコードされていますが、これは自分の用途をコードするプレーンテキストファイルが記録されていない
、これは問題の根本である、引用符がCE d2としている見るためにバイナリエディタを使用してGBKのエンコードにソースコードの前に保存するためのテストかもしれしたがって、CAのC7のBA BAのD7 D6を8バイト。
今ではどのように見えるかを開くために、メモ帳を使用し、正体のWindowsの中国語(繁体字)にファイルをコピー?
; = "Dianyao羅建" QStringの
QLabelラベル(A);
label.showを();
欧米人は、それを開くために、その後、メモ帳をWindowsのシステムを置きますか?
= QStringの"○×ÎòêÇoo";
QLabelラベル(A);
label.show();
同じファイル、変更を加えることなく、しかし、8バイトのCEのD2のCA C7のBAのBA D7 D6を 、 GBKの使用ヨーロッパ人と本土からの人々 、香港、マカオ、台湾同胞はBIG5使用されているだけでなく、ラテン-1は、見ているようだが、それは完全に別の文字です。
2明確なコンセプト:我々はすべて「A」とは「\ X41」を知っているのと同じと等価です。
エンコードGBKの
のconstのchar * STR = "I文字"
に相当
= "\ XCEのconstのchar * strの \ XD2 \ XCA \ xc7 \ XBA \ XBA \ XD7 \ XD6";
UTF-8を使用してエンコードなど価格
のconstのchar * strの= "\ XE6 \ X88 \ X91 \ XE6 \ x98 \ XAF \ XE6 \ XB1 \ x89 \ xe5 \ XAD \ X97";
注意:この文に、このようなUTF-8のBOMを持つとして保存するなど、不完全な権利を、コンパイラCL、UTF-8自体の文字、しかしはGBKエンコーディングを対応するプログラムShique内に格納されている場合。
明確なコンセプト3:QStringの内部では、Unicodeを使用しています。
内部にはQStringのがUnicodeで使用しています、それは同時にGBK文字「I漢字」、BIG5文字「Dianyao羅建」ラテン-1、および文字「Ö×ÎòêÇoo」に保存することができます。
1つの問題は、8バイトのソースコード"\ XCE \ XD2 \ XCA \ xc7 \ XBA \ XBA \ XD7 \ XD6"、 QStringの中に共存する方法をUnicodeに変換されていますか?GBK、BIG5、ラテン-1、またはそうでなければ...によると
、あなたがそれを教えていない場合には、それはUnicodeのコードのデフォルトのLatin-1、その後、8文字「Ö×ÎòêÇoo」で選択された中のQStringに格納されています。結局、8ラテン文字を使用すると、4つの中国語の文字を見ることを期待どこ見える、いわゆる文字化け
QStringの仕事
のconstのchar * strの=「私は漢字だ」;
QStringの列str = Aは、
実際には、非常に簡単な質問、あなたはQStringののUnicode文字列に狭いchar *文字列から必要なとき、あなたはあなたにエンコードされているもので、このchar *文字列を指示する必要がありQStringの?GBK、BIG5、ラテン語の1-
理想的な状況は次のとおりです。*合格QStringの、QStringのをCHARとあなたのコードが何であるかを教えてくれるとき:
次の関数と同様に、C列に合わせてどのようなエンコーディングプロセスを知っているメンバ関数をQStringの
QStringの:: fromAscii QStringの(STR CONSTチャー*、int型のサイズ= -1)
QStringのQStringの:: fromLatin1(STRのCONSTチャー*、int型のサイズ= -1)
QStringのQStringの:: fromLocal8Bit(STR CONSTチャー*、int型のサイズ= -1)
QStringのQStringの:: fromUtf8(のconst char型*の STR、INTサイズ= -1)
QStringのは、これまですべての人のニーズを満たすことができなかった、これらの関数の唯一のメンバーを提供し、例えば、中国語(簡体字)Windowsで、local8BitはGBKですが、文字列行う方法BIG5またはラテン-2はありますか?
そして、必ず自分自身のコーディングを担当するために知って最初にすべてのQTextCodecの、強力なQTextCodecそれを使用して、あなたはchar型の文字列にそれを与える、それが正しいUnicodeのアップに変換することができます。
QStringのQTextCodec ::のToUnicode(のconstのchar *文字)のconst
が、この呼び出しが多すぎる、私が指示したかったトラブル
= strをQStringの、
または
(文字列)をQStringの、
どのように行うとなりますか?
このように、あなたのコーディング、唯一の他の方法ををstr QSTRING何伝えるために確かに方法はありませんしばらく。これは、冒頭に記載されている
。setCodecForCStrings(QTextCodecによってcodecForName ::( "GBK")):: QTextCodecによって
:: QTextCodecによってsetCodecForCStrings(QTextCodecによってcodecForName ::( "UTF-8"));
デフォルトで使用QStringの符号化を提供します。ソースコードでの使用かどうかはGBKを使用する、一般GBKであり、ソースコードは、UTF-8、UTF-8を使用することです。あなたはBOMのでUTF-8を保存し、CLコンパイラのMicrosoftの使用になった場合でも、例外が1つあり、この時はまだGBKです。
要約の下では、主な理由は、文字化けしている:内部のQStringはUnicodeを使用して、それは同時に、GBK文字を格納することができ、BIG5文字「羅ディアン八尾建、」だけでなく、Latin-1文字「私は漢字のです」」
あなたはQStringののUnicode文字列に狭いchar *文字列から必要なときに、あなたはあなたにエンコードされているもので、このchar *文字列を指示する必要がありQStringの?GBK、BIG5、ラテン-1?
場合あなたがそれを教えていないで、それはデフォルトのLatin-1で選択され、その後、8つの文字「Ö×ÎòêÇooは」コードはQStringの中ユニコードに格納されます。結局、8つのラテン文字を使用すると、4つの中国語の文字を見ることを期待ところ、表示される
文字化けと呼ばれます。
:直接設定でmain.cppにに記載されている多くのオンラインの方法があります
。QTextCodec * = QTextCodec :: codecForName CODEC( "UTF-8")
QTextCodec :: setCodecForTr(CODEC);
QTextCodec :: setCodecForLocale(CODEC);
QTextCodec :: setCodecForCStringsは(コーデック);
プログラムは、中国路系を読み、あるいは中国のパスの下に、外部プログラムを呼び出す可能性があるため、実際には、問題もいくつかのケースでは、システムが2312であれば、この時間は、問題を抱えています。
パスはQStringのにデポジットに中国語UTF-8を使用して符号化されているので、中国のパスの復号化システムは、システムがGB2312使用される時間を読み出し、それを外部のプログラム中国のパスを与えると調整されます。
以下の方法は、上記の問題を解決することができる:
QTextCodecによってQTextCodecによって:: = * codecForName CODEC( "UTF-8");
QTextCodec :: setCodecForTr(CODEC)によって、
:: QTextCodecによってsetCodecForLocale(QTextCodec :: codecForLocaleによって());
QTextCodec :: setCodecForCStringsによって(QTextCodec :: codecForLocaleによって());
すべてのローカルエンコーダに外部復号文字列コードの。