std::string と std::wstring についてはすべて知っていますが、UTF-8 と UTF-16 の拡張文字エンコーディングに十分に注意を払っていないようです (少なくとも Windows では)。UTF-32 もサポートされていません。
UTF-8、UTF-16、および UTF-32 を完全にサポートするクロスプラットフォームのドロップイン置換クラスを知っている人はいますか?
std::string と std::wstring についてはすべて知っていますが、UTF-8 と UTF-16 の拡張文字エンコーディングに十分に注意を払っていないようです (少なくとも Windows では)。UTF-32 もサポートされていません。
UTF-8、UTF-16、および UTF-32 を完全にサポートするクロスプラットフォームのドロップイン置換クラスを知っている人はいますか?
そして、軽量で非常にユーザーフレンドリーな、ヘッダーのみの UTF-8 ライブラリUTF8-CPPを忘れないでください。ドロップインの代替品ではありませんが、簡単に組み合わせて使用でき、std::string
外部依存関係はありません。
C++0x には、クラス std::u32string と std::u16string があります。GCC はすでにそれらを部分的にサポートしているため、既に使用できますが、Unicode のストリーム サポートはまだ行われていませんC++0x での Unicode サポート。
これは STL ではありませんが、C++ で適切な Unicode が必要な場合は、ICUを参照してください。
STL では UTF-8 はサポートされていません。代わりに、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;
}
UTF-8 サポートには、Glib::ustringクラスがあります。後にモデル化されてstd::string
いますが、utf-8 対応です。たとえば、イテレータで文字列をスキャンする場合です。const
文字を置き換えると文字列の長さが変わる可能性があり、他のイテレータが無効になる可能性があるため、イテレータが always であるなど、いくつかの制限もあります。
ustring
は他のエンコーディングを utf-8 に自動的に変換しません。Glib
ライブラリにはこのためのさまざまな変換関数 があります。ただし、文字列が有効な utf-8 であるかどうかを検証できます。
また、ustring
とstd::string
は交換可能です。つまりustring
、 std::string へのキャスト演算子があるため、から構築できるように、が期待されるustring
場所でパラメータとして aを渡すことができます。std::string
ustring
std::string
Qtには、内部で UTF-16 を使用する QString がありますが、std::wstring、UTF-8、Latin1、またはロケール エンコーディングとの間で変換するメソッドがあります。QStrings を基本的に何でも変換できる QTextCodec クラスもあります。しかし、文字列だけに Qt を使用するのはやり過ぎのように思えます。
http://grigory.info/UTF8Strings.About.htmlも参照してください。これはUTF8ネイティブです。