私はstd :: stringとstd :: wstringについてすべて知っていますが、UTF-8とUTF-16の拡張文字エンコーディングにはあまり注意を払わないようです。 UTF-32もサポートされていません。Unicodeを正しく処理するSTL文字列クラスはありますか?
UTF-8、UTF-16、およびUTF-32の完全なサポートを提供するクロスプラットフォームのドロップイン置換クラスについて知っていますか?
私はstd :: stringとstd :: wstringについてすべて知っていますが、UTF-8とUTF-16の拡張文字エンコーディングにはあまり注意を払わないようです。 UTF-32もサポートされていません。Unicodeを正しく処理するSTL文字列クラスはありますか?
UTF-8、UTF-16、およびUTF-32の完全なサポートを提供するクロスプラットフォームのドロップイン置換クラスについて知っていますか?
まあC++ 0xのではstd ::クラスu32stringとstd :: u16stringがあります。 GCCはすでにそれらを部分的にサポートしていますので、すでに使用できますが、ユニコードのストリームサポートはまだ行われていませんUnicode support in C++0x。
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;
}
それは本当にsropinの代わりにはありません;)理想的には、 std :: string8、std :: string16、std :: string32のようなもの... – Goz
UTF-8サポートの場合、Glib::ustringクラスがあります。これはstd::string
の後にモデル化されていますが、例えばutf-8を意識しています。イテレータを使用して文字列をスキャンしているときです。また、いくつかの制限があります。文字を置換すると文字列の長さが変わる可能性があるため、イテレータは常にconst
であるため、他のイテレータを無効にすることができます。
ustring
は、他のエンコーディングを自動的にutf-8に変換しません。Glib
ライブラリには、これに対応してさまざまなconversion functionsがあります。文字列が有効なutf-8かどうかを確認できます。すなわちustring
ははstdするキャスト演算子を持っている::文字列ustring
を構築することができるよう、あなたが、std::string
が期待されているパラメータ、そしてもちろんその逆としてustring
を渡すことができるように
そしてまた、ustring
とstd::string
は互換性があり、 std::string
から。
それはほぼ完璧です。恥ずかしがり屋の16と32ビットのユニコードサポートについて... – Goz
また、http://grigory.info/UTF8Strings.About.htmlを見ると、UTF8ネイティブです。
うーん、私は新しい標準で気づいていませんでした。とても興味深い。私はC++ 0xサポート(iPhoneコンパイラなど)が不足しているコンパイラでは使用できません。これらのクラスがまだ存在していないことは本当に私に衝撃的です... – Goz
しかし、興味深いことに、GCC> 4.4とVS2010の両方がサポートしているようです。それは華麗です。 Windows、Linux、Androidモバイルプラットフォームをカバーする主要なプラットフォームについてClangはまた、 "多くの"例がうまくいくと述べています。 – Goz
@Gozまあ、すべてがあなたの思うほど良いわけではありません。 VS2010はUnicode文字列をサポートしますが、Unicode文字列リテラルはサポートしていません。 u "Hello"はUTF-16文字列リテラルであり、 "Hello"はUTF-32リテラルです。ビジュアルスタジオはそれらを認識しません。また、すでにgccが入力をサポートしていないと言いましたが、出力ストリームはまだありません。 – UmmaGumma