8


3

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

私は私のコードの至る所でstd

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

2 Answer


15


C + 0xでは、「 wchar_t 」ではなく、「 char16_t 」と「 char32_t +」を使用してUTF-16とUTF-32を格納します。

ドラフトn2798より:

_ _ * 22.2.1.4クラステンプレートcodecvt *

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

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

他のエンコーディングはユーザー定義のstateT型に特化することで変換できます。 stateTオブジェクトには、特殊なdo_inメンバーまたはdo_outメンバーとやり取りするのに便利な任意の状態を含めることができます。 _ _

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

したがって、最善の解決策は既存のライブラリを使用することです。 UNICODEのバグを追いかけるのは、努力や時間を最大限に利用することではありません。 ぜひご覧ください。

  • GNU libiconv

  • IBMのhttp://www-01.ibm.com/software/globalization/icu/[libicu]

C 0x Unicode文字列リテラルの詳細http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals [ここ]


0


真剣にありがとう。 私はまだ登録されていないので、私は投票として直接投票することも、コメントとして直接回答することもできません。

私はcodecvtで何かを学びました。 私はあなたが提案するライブラリについて知っていました、そして、次のリソースも役に立つかもしれませんhttp://www.unicode.org/Public/PROGRAMS/CVTUTF/。

プロジェクトはオープンソースであるべきライブラリのためのものです。 私は外部ライブラリとの依存関係を最小限にすることを好むでしょう。 私はすでにlibgcとboostとの依存関係を持っていますが、後で使うのはスレッドだけです。 私は本当にC標準に固執することを好むでしょう、そして私はGCがサポートしていることがどういうわけか落とされたことに少しがっかりしています。

どうやらVC express 2008は、iccだけでなくC 0x標準の大部分をサポートしていると言われています。 私は現在VCで開発しており、ライブラリがリリースされるまでまだ時間がかかるので、codecvtとchar32_tの文字列を試してみたいと思います。

誰もがこれを行う方法を知っていますか? 別の質問を投稿する必要がありますか?