私はICUとコードプロジェクトのutf8のような小さなライブラリを知っています(正確な名前を忘れてください)が、これらのどれも私が望むものではありません。
私が本当に欲しいのはICUのようなものですが、より親しみやすい方法でまとめられています。
具体的には:
- 完全なオブジェクト指向
- c ++標準ストリームの実装、または少なくとも同じ役割を果たすもの。
- ロケールに依存する方法で時刻や日付などをフォーマットできます(たとえば、英国ではdd / mm / yy、米国ではmm / dd / yy)。
- 文字列の「内部」エンコーディングを選択できるので、たとえば、Windows APIおよびDirectXとの間で文字列をやり取りするときに、多くの変換を回避するために、WindowsでUTF-16を使用するようにすることができます。
- エンコーディング間での文字列の簡単な変換
そのようなライブラリが存在しない場合、標準のc ++クラスを使用してICUをラップすることは可能ですか。たとえば、std::stringおよびstd::wstringと同じ使用法を持つustringを作成し、ストリームのバージョンを実装することもできます。 (最適には、既存のものと完全に互換性があります。つまり、std :: ostreamを期待する関数に渡すことができ、内部形式とascii(またはutf-8)の間の変換をオンザフライで実行します)?どれだけの作業が可能だとしたら?
編集:c ++ 0x標準を見て、utf8、utf16、utf32のリテラルに気づいたことは、標準ライブラリ(文字列、ストリームなど)がこれらのエンコーディングとそれらの間の変換を完全にサポートすることを意味しますか?もしそうなら、誰かがVisual Studioがそれらの機能をサポートするまでにどれくらいの時間がかかるかについて何か考えを持っていますか?
EDIT2:既存のc ++サポートの使用に関しては、ロケールとファセットのものを調べます。
私が遭遇した問題の1つは、ファイルI / Oのウィンドウの下で2バイトであるwchar_tの周りに定義されたストリームを使用する場合、ファイル自体にASCIIを使用しているように見えることです。
std::wofstream file(L"myfile.txt", std::ios::out);
file << L"Hello World!" << std::endl;
結果として、ファイルに次の16進数が含まれます
48 65 6C 6C 6F 20 57 6F 72 6C 64 0D 0A
これは、予想されるutf-16出力ではなく明らかにASCIIです:
FF FE 48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 72 00 6C 00 64 00 0D 00 0A 00