QStringは、ストレージ(コンパイラ)とデコード(実行期間)に分けられ、VSコンパイラの自業自得、QT 5の変化に分けられます

7718 ワード

多くいくつの編を読んで、すべての編はいくつかのエッセンスを取って私のQStringに対する理解を深めます.
------------------------------------------------------------------
QString内部ではUTF-16を使用してデータを格納しているが、char*を読む場合(C++言語で最も一般的な形式、特にconstではそうである)、デフォルトではlatin 1に従って文字列を解読しているため、文字列が乱れている.
QStringのメンバー関数は、C文字列QString QString::fromAscii(const char*str,int size=-1)QString QString::fromLatin 1(const char*str,int size=-1)QString QString::fromLocal 8 Bit(const char*str,int size=-1)QString QString QString::fromUtf 8(const char*str,int size=-1)単QStringはこのいくつかのメンバー関数だけを提供して、みんなの需要をはるかに満たすことができません.例えば、簡体字中国語Windowsの下で、local 8 BitはGBKですが、char列がBIG 5かLatin-2ではどうしますか.では、強力なQTextCodecを動員しましょう.まず、QTextCodecは自分が担当しているコードを知っているに違いありません.それからchar列を送ります.それは正しくUnicodeに変えることができます.QString QTextCodec::toUnicode ( const char * chars ) const
しかし、この呼び出しは面倒で、私は直接
QString a= str;
または
QString a(str);
このように使ったらどうしますか.
これでは、QStringのstrがどのようにコードされているかを同時に教えることはできません.他の方法しかありません.これが冒頭の
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QStringのデフォルトで使用するエンコーディングを設定します.どちらを採用するかというと、一般的にはソースコードがGBKであり、GBKであり、ソースコードがUTF-8であればUTF-8である.しかし、例外として、BOM付きUTF-8で使用されているマイクロソフトのclコンパイラに保存されている場合は、GBKです.
一言で言えば、中国語のパスを読むのもXMLを書くのも簡単で、ほとんど何も設定しなくてもいいです.QTextCodec*ttt=QTextCodec::codecForName("GBK");//上には何も書かないで、この文だけ書けばもう十分です.writer.writeTextElement("Chinese 5",ttt->toUnicode("中国");//
参照先:
http://hi.baidu.com/dbzhang800/item/431f800fcb653e6dd55a1142http://www.360doc.com/content/12/0511/18/6828497_210377394.shtml
------------------------------------------------------------------
  • 万悪のMSVC?
  • 注意:msvcのコンパイラを使用している場合は、前に述べた以外に、いくつかのことを知る必要があります.
  • ソースファイルがBOM付きutf 8,utf 16などの符号化フォーマットであれば、トランスコードの動作があります.
  • このようにtr()に包まれた文字列は、ソースファイルで用いられる符号化とは異なる、時間GBK、BIG 5などのsystem符号化に符号化される.
  • です.したがって、ソースファイルの符号化も指定する必要があります.
  • CODECFORTR = GB2312
    CODECFORSRC = UTF-8

    http://blog.csdn.net/dbzhang800/article/details/7325698http://blog.csdn.net/dbzhang800/article/details/7540905
    ------------------------------------------------------------------
    Qt 5では、この問題はついに存在しなくなった.
    この2つの関数
    QTextCodec::setCodecForTr(...)
    QTextCodec::setCodecForCStrings(...)

    そのまま取り除かれた.
    これにより、影響を受けるコードは次のようになります.
    QString s1 = "    ";
    QString s2("    "); QString s3 = QObject::tr("    ")
  • 悪いメッセージ:
  • 現在、Qt 5にはsetCodecXXXという2つの関数が削除されていますが、デフォルトの符号化はlatin 1です.使いたいなら
    "    "

    このような文字列は、自分でQTextCodecやこのQString::fromXXXというものを使って変換しなければなりません
  • 良いニュースは:
  • Qt 5がリリースされると、デフォルトはutf 8符号化になり、Qt符号化の問題から完全に解放されます.
  • 悪いメッセージは、MSVC 2005/2008/2010を使用している場合、utf 8符号化が使用できない可能性があります.
  • 次のコード
    QString s1 = "    ";
    QString s2("    "); QString s3 = QObject::tr("    ")

    仕事ができません.
  • MSVC 2005からコンパイラに文字列で使用する符号化を設定できないためです.2003年までは設定できませんでしたが、ソースファイルの符号化に従います.2005年には自業自得で、ソースファイルがBOMを持たないutf 8に保存されていても、変換しようとします.

  • 良いニュースは何ですか.
    Windowsの下でMinGWを使用している場合は、ソースファイルをutf 8に保存すると、前のコードが直接動作します(他の設定は必要ありません)
    他のプラットフォームにいる場合は、utf 8ファイルがデフォルトであるはずです.同様に設定する必要はありません.
    http://blog.csdn.net/dbzhang800/article/details/7325698
    ------------------------------------------------------------------
    setCodecXXXがなくなったQt 5
  • Qt 5は、実行文字セットがUTF 8であると仮定し、ユーザが勝手に変更することを許さない.これにより、Qt 4におけるsetCodecXXXの様々な副作用は存在せず、中国語の問題はより簡単になる.

  •  
    QString s1 = "  ";
    QString s2("  "); QString s3 = tr("  ") QString s4 = QStringLiteral("  ");//          ,      QString s5 = QString::fromWCharArray(L"  "); QString s6 = u8"  ";//C++11 QString s7 = tr(u8"  ") ...

    これらはすべてQt 5のデフォルトで正常に動作します.唯一の要求は、C++の文字セットの実行(the execution character set)がUTF-8であることを確認することです.
    http://blog.csdn.net/dbzhang800/article/details/7542672
    ------------------------------------------------------------------
    QtCreatorはこの問題をエスケープ符号化で解決したようだ:コントロールに中国語の「終了」を書き込み、自動的に生成されたものを表示する.hファイルには、非ascii文字に対してエスケープ符号化が採用されていることがわかります.このようにactionExit->setText(QAPplication::translate(「MainWindow」、「351200200345207272」,0);
    投稿が終わったばかりで方法が見つかりました.utf-8の16進数で定数文字を表すことができます.どうしてもソースコードに英語以外の文字列を使うなら、公式の推奨方法に簡単に合うか、エスケープ文字を使って説明するか、自分で小さなツールを書いて便利に変換します.http://bbs.csdn.net/topics/390491128http://download.csdn.net/detail/aqtata/5596247UTF-8文字列をLatin 1符号化に変換します.例えば、中国語「こんにちは」から「xE 4xBDxA 0xE 5xA 5xBD」に変換します.
    ------------------------------------------------------------------
    ソースコードはUTF-8でなければなりません.QStringはQt 5で必要です.QStringの8ビット(8-bit)メンバー関数のデフォルトの符号化をLatin 1からUTF-8に変更します.QLatin 1 Stringを使用してこれらの文字列をカプセル化することをお勧めします.特に、QLain 1 StringのリロードがあるQStringの関数に使用しています.
    UTF-8でコードを書き換えるか、適切なQLatin 1 StringまたはQTextCodec::toUnicode関数で文字列をカプセル化する必要があります.前のオプションを使用することをお勧めします.ソースコードでUTF-8を使用します.
    http://blog.qt.digia.com/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/
    ------------------------------------------------------------------
    コードに直接中国語文字列を使用し、WindowsではQCreatorでもVisual Studioでも中国語文字列で文字列表示が乱れる問題が発生するのは、QStringのデフォルトでAscii符号化が使用されているためです.手動でコード「QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()」を入れてから問題を解決することができます.なぜQtがデフォルトではなくQTextCodec::codecForLocaleを使用するのでしょうか.これは各国に衝突していませんね.
    ほほほ、もしこのようにするならば、Qtは10年以上後退したことを知っているのではないでしょうか.これは10年以上前のやり方ですね.同じプログラムがプラットフォームをまたぐことができなくなりました.utf 8が盛んだった時代、VC 6/7/8/9/...、デフォルトではlocale文字セットが採用され、時代とは少し合わなかった.http://qt-project.org/forums/viewthread/19144
    ------------------------------------------------------------------
    QTのQStringコンテンツはUnicodeをテキスト符号化として使用する.しかし、実際のシステムでは、GBK、utf 8などの他の符号化が一般的に採用されている.これらのフォーマットの互換性を容易にするために、QTには2つの文字列タイプが設定されている:QCStringクラス:Cタイプの文字列は、0で終わる必要があります.つまり、中間に0を含むことはできません.例えば、GBK符号化文字列QByteArrayクラス:中間に0を含むことができる.例えばutf 8符号化文字列
    注意:テストによりDelphiのStringは0の文字列を格納できることがわかりました.
    さらに、あるブロックの文字列(例えば、ネットワークから取得された文字列フラグメント)を符号化変換するために、QTは、このような文字列の復号化を支援するQTextDecoderの補助クラスを提供する.QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");QTextDecoder *decoder = codec->makeDecoder();QString string;while (new_data_available()) {QByteArray chunk = get_new_data();string += decoder->toUnicode(chunk);}
    http://blog.sina.com.cn/s/blog_a401a1ea0101fh3z.html
    -------------------------------------------------------------------
    Iniファイルの中国語文字化けしQSettings settings("xxxx.ini",QSettings::IniFormat);settings.setIniCodec(QTextCodec::codecForName("GB2312"));//ここに設定を追加すると、iniファイルの中国語settingsを読み書きできます.beginGroup("company");
    中国語のファイルの中国語を読み取る文字化けしQFile file(“xxxx.txt”);QTextStream stream(file,QIODevice::ReadOnly);stream.setCodeC( QTextCodec::codecForName("GB2312") );stream.readAll();