C++0x が UTF-8、UTF-16、および UTF-32 リテラルのサポートを追加することを確認しました。しかし、3 つの表現の間の変換はどうでしょうか。
コードのどこでも std::wstring を使用する予定です。しかし、ファイルやネットワークを扱うときは、UTF-8 でエンコードされたデータを操作する必要もあります。C++0x もこれらの操作をサポートしますか?
C++0x では、 ではchar16_t
なくchar32_t
UTF-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 文字列リテラルの詳細はこちら