8

C++0x が UTF-8、UTF-16、および UTF-32 リテラルのサポートを追加することを確認しました。しかし、3 つの表現の間の変換はどうでしょうか。

コードのどこでも std::wstring を使用する予定です。しかし、ファイルやネットワークを扱うときは、UTF-8 でエンコードされたデータを操作する必要もあります。C++0x もこれらの操作をサポートしますか?

4

2 に答える 2

15

C++0x では、 ではchar16_tなくchar32_tUTF-16 と UTF-32 を格納するために使用されwchar_tます。

ドラフトn2798から:

22.2.1.4 クラス テンプレート codecvt

2 クラス codecvt は、ワイド文字からマルチバイト文字への変換、または Unicode と EUC などのワイド文字エンコーディング間の変換など、あるコードセットから別のコードセットに変換する場合に使用されます。

3 表 76 (22.1.1.1.1) で必要な特殊化は、実装定義のネイティブ文字セットを変換します。codecvt は縮退変換を実装します。まったく変換されません。特殊codecvt<char16_t, char, mbstate_t>化は UTF-16 と UTF-8 エンコーディング スキームcodecvt <char32_t, char, mbstate_t>間の変換を行い、特殊化は UTF-32 と UTF-8 エンコーディング スキーム間の変換を行います。codecvt<wchar_t,char,mbstate_t>ナロー文字とワイド文字のネイティブ文字セット間で変換します。mbstate_tライブラリの実装者に知られているエンコーディング間の変換を実行するための特殊化。

他のエンコーディングは、ユーザー定義の stateT 型に特化することで変換できます。stateT オブジェクトには、特殊化された do_in または do_out メンバーとの通信に役立つ任意の状態を含めることができます。

重要なのは、使用されるエンコーディングについて保証するものwchar_tではないということです。マルチバイト文字を保持できる型です。限目。ソフトウェアを書くつもりなら、この妥協を受け入れなければなりません。C++0x 準拠のコンパイラは、まだ遠いです。VC2010 CTP および g++ コンパイラの価値をいつでも試すことができます。さらに、wchar_tプラットフォームによってサイズが異なるため、注意が必要です (VS/Windows では 2 バイト、GCC/Mac では 4 バイトなど)。-fshort-wchar次に、問題をさらに複雑にする GCCのようなオプションがあります。

したがって、最善の解決策は、既存のライブラリを使用することです。UNICODE のバグを追跡することは、労力や時間の最善の使い方ではありません。以下をご覧になることをお勧めします。

C++0x Unicode 文字列リテラルの詳細はこちら

于 2009-03-07T10:40:16.693 に答える