私はICUとutf8のような小さなライブラリを知っています(正確な名前は忘れてください)。しかし、これらのどれも私が望むものではありません。C++ unicodeの質問
私が本当に欲しいのは、ICUのようなものですが、よりフレンドリーな方法で包み込まれています。
具体:
- 完全
- C++標準ストリームの実装、又は同じ役割を行う少なくとも何かを配向オブジェクト。
- 時間、日付などをロケールに依存した形式でフォーマットすることができます(英国ではdd/mm/yy、米国ではmm/dd/yy)。
- 文字列の「内部」エンコーディングを選択できるようにするため、Windows APIとDirectXとの間で文字列を渡すときにたくさんの変換を避けるために、Windows上でUTF-16を使用することができます。
- 簡単な文字列変換エンコーディング
の間には、そのようなライブラリが存在しない場合は、標準C++のクラスを使用してICUをラップすることが可能であるので、私は、例えばはstdと同一の用法を持っているのUStringを作成することができます::文字列とstd :: wstringのまた、ストリームのバージョンを実装することもできます(既存のものと完全に互換性があります。つまり、std :: ostreamを期待する関数に渡すことができます。 d ascii(またはutf-8)をオンザフライで実行していますか?それはどれくらいの仕事が可能だろうと仮定しますか?
EDIT: また、utf8、utf16、utf32のC++ 0x標準と注目リテラルを見れば、標準ライブラリ(文字列、ストリームなど)がこれらのエンコードを完全にサポートし、それら? Visual Studioがこれらの機能をサポートするまでどれくらいの時間がかかりますか?
EDIT2: 既存のC++サポートを使用する場合は、ロケールとファセットを参照します。
私が遭遇した問題の1つは、wchar_tの周りに定義されているストリームをファイルi/oのためのウィンドウの下に2バイトで使用すると、それ自身のファイルにはまだasciiを使用しているようです。
FF FE:
はかなりの期待UTF-16出力よりも明らかにASCIIで0Dの0A
は
48 65 6C 6C 6F 20 57 6F 72 6C 64ファイルに次ヘクスをもたらし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
UTF-16テキストは実際に**ローカルの8ビットエンコードに**変換**されています!だからあなたはutf-16をファイルに書き込まない。 std :: locale :: global(std :: locale());を呼び出すことを忘れないでください。 – Artyom
これでファイルをエンコードする方法を教えてください。私はstd :: localを試しました...あなたは上記のように言いましたが、何の効果もないようです:( –
システムロケール 'ru_RU.UTF-8'なら、エンコーディングはutf-8です。あなたが他のロケールを指定することもできます: 'locale :: globale(locale(" de_DE.ISO-8859-1 "));'(注意、私はPOSIX名のロケール名を使用しています.Windowsあなたはロケール名が – Artyom