2011-02-01 8 views
13

私はstd :: stringとstd :: wstringについてすべて知っていますが、UTF-8とUTF-16の拡張文字エンコーディングにはあまり注意を払わないようです。 UTF-32もサポートされていません。Unicodeを正しく処理するSTL文字列クラスはありますか?

UTF-8、UTF-16、およびUTF-32の完全なサポートを提供するクロスプラットフォームのドロップイン置換クラスについて知っていますか?

答えて

9

まあC++ 0xのではstd ::クラスu32stringとstd :: u16stringがあります。 GCCはすでにそれらを部分的にサポートしていますので、すでに使用できますが、ユニコードのストリームサポートはまだ行われていませんUnicode support in C++0x

+0

うーん、私は新しい標準で気づいていませんでした。とても興味深い。私はC++ 0xサポート(iPhoneコンパイラなど)が不足しているコンパイラでは使用できません。これらのクラスがまだ存在していないことは本当に私に衝撃的です... – Goz

+0

しかし、興味深いことに、GCC> 4.4とVS2010の両方がサポートしているようです。それは華麗です。 Windows、Linux、Androidモバイルプラットフォームをカバーする主要なプラットフォームについてClangはまた、 "多くの"例がうまくいくと述べています。 – Goz

+2

@Gozまあ、すべてがあなたの思うほど良いわけではありません。 VS2010はUnicode文字列をサポートしますが、Unicode文字列リテラルはサポートしていません。 u "Hello"はUTF-16文字列リテラルであり、 "Hello"はUTF-32リテラルです。ビジュアルスタジオはそれらを認識しません。また、すでにgccが入力をサポートしていないと言いましたが、出力ストリームはまだありません。 – UmmaGumma

7

これはSTLではありませんが、C++で適切なUnicodeが必要な場合は、ICUを参照してください。

+0

面白そうです。恥ずかしいことに、STLの文字列サポートはありません...その場合は完璧です... – Goz

+0

これについて読むことはできますが、DB2で時間を費やした後は、IBMから来るものに触れる前に2回考えると思います。あなたはそれに取り組んだことがありますか?いいですか? – davka

+1

@ゴーズ:私はもっと多くのことに同意できませんでした。ユニコードは、バイトシーケンスを格納する以上のことをしてくれる文字列を望むのに十分な "標準"です... –

3

STLにはUTF-8がサポートされていません。代替youoはboost codecvtを使用することができたよう:

//... 
// My encoding type 
typedef wchar_t ucs4_t; 

std::locale old_locale; 
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>); 

// Set a New global locale 
std::locale::global(utf8_locale); 

// Send the UCS-4 data out, converting to UTF-8 
{ 
    std::wstringstream oss; 
    oss.imbue(utf8_locale); 
    std::copy(ucs4_data.begin(),ucs4_data.end(), 
     std::ostream_iterator<ucs4_t,ucs4_t>(oss)); 

    std::wcout << oss.str() << std::endl; 
} 
+0

それは本当にsropinの代わりにはありません;)理想的には、 std :: string8、std :: string16、std :: string32のようなもの... – Goz

2

UTF-8サポートの場合、Glib::ustringクラスがあります。これはstd::stringの後にモデル化されていますが、例えばutf-8を意識しています。イテレータを使用して文字列をスキャンしているときです。また、いくつかの制限があります。文字を置換すると文字列の長さが変わる可能性があるため、イテレータは常にconstであるため、他のイテレータを無効にすることができます。

ustringは、他のエンコーディングを自動的にutf-8に変換しません。Glibライブラリには、これに対応してさまざまなconversion functionsがあります。文字列が有効なutf-8かどうかを確認できます。すなわちustringははstdするキャスト演算子を持っている::文字列ustringを構築することができるよう、あなたが、std::stringが期待されているパラメータ、そしてもちろんその逆としてustringを渡すことができるように

そしてまた、ustringstd::stringは互換性があり、 std::stringから。

+0

それはほぼ完璧です。恥ずかしがり屋の16と32ビットのユニコードサポートについて... – Goz

11

そして、軽量で使いやすいヘッダーのみのUTF-8ライブラリUTF8-CPPを忘れないようにしましょう。ドロップイン置換ではなく、std::stringと一緒に使用すると簡単に外部依存関係はありません。

+0

これは素敵な小さな図書館です:) – Skurmedel

2

Qtには、内部的にUTF-16を使用しますが、std :: wstring、UTF-8、Latin1またはロケールエンコーディングに変換するメソッドがあります。また、QStringを基本的に何かに変換するQTextCodecクラスもあります。しかし、単に文字列にQtを使用することは、私にとっては残酷なもののようです。

+0

ええ、悲しいかな、あなたは完全に文字列のために純粋にそれを使用しています。私はqtが好きですし、それをかなり使います:) – Goz

関連する問題