1

私はC++で多数のQtアプリケーションを開発していますが、それらはすべて、Qtを使用する一般的な機能のためにいくつかのモジュール(変換ユニット)を使用しています。

C文字列(暗黙の変換)またはC ++文字列オブジェクト(fromStdString())をQStringオブジェクトに変換するときはいつでも、元のデータはUTF-8でエンコードされ、その逆も同様です(toStdString())。

デフォルトはLatin-1であるため、コーデックを「手動で」(すべてのプログラムのinitプロシージャで)UTF-8に設定する必要があります。

QTextCodec :: setCodecForCStrings(QTextCodec :: codecForName( "utf8"));

すべてのモジュールにinitプロシージャがあるわけではありません。クラスを含むものはそうです(私はこの行をクラスコンストラクターに入れることができます)が、いくつかのモジュールはたくさんの関数を持つ名前空間を含んでいます。したがって、setCodecForCStrings()の場所はありません。暗黙的に(モジュールの1つから)QStringから/に変換するときはいつでも、メインプログラムのinitプロシージャによってすでに設定されているコーデックに依存しています。これはかなり悪い解決策のようです。

モジュールでコーデックをUTF-8に設定する信頼できる方法はありますか、それとも(少なくとも私のモジュールでは)暗黙の変換をまったく使用せず、std :: string(q q.toStdString()の代わりに.toUtf8()。constData())?

4

1 に答える 1

3

これは、コンストラクターにいくつかのinitコードを持つ、自動的にインスタンス化されたシングルトン類似クラスのクラス定義を使用して実行できます。

class ModuleInit {
    static ModuleInit *instance;
public:
    ModuleInit() {
        QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
    }
};
ModuleInit * ModuleInit::instance = new ModuleInit(); // put this line in .cpp!

このコードをプロジェクトの任意の場所に配置すると、テキストコーデックがUTF-8に設定されます。ただし、上記のコードはmain()メソッドの前でも実行されるため、main()メソッドのテキストコーデックを上書きすることはできます。

どこでも」とは、もちろん構文的に許可されている場所を意味します。クラス定義をヘッダーファイルに入れ、インスタンス化を適切な.cppファイルに入れます。

コード全体を1つの.cppファイルに入れて、moduleinit.cppコンパイルしてリンクすることもできますが、明示的に使用することはできません(インクルードできるヘッダーファイルはありません...)。これにより、最初のインスタンス化を除いて偶発的なインスタンス化も回避され、クラス名が重複しても問題は発生しません。

1つの特定のファイルでC文字列のコーデックを設定できないことに注意してください。を使用してコーデックをQTextCodec::setCodecForCString設定すると、アプリケーション全体に設定されます。

于 2012-07-08T17:46:35.027 に答える