13

std::string と std::wstring についてはすべて知っていますが、UTF-8 と UTF-16 の拡張文字エンコーディングに十分に注意を払っていないようです (少なくとも Windows では)。UTF-32 もサポートされていません。

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

4

7 に答える 7

11

そして、軽量で非常にユーザーフレンドリーな、ヘッダーのみの UTF-8 ライブラリUTF8-CPPを忘れないでください。ドロップインの代替品ではありませんが、簡単に組み合わせて使用​​でき、std::string外部依存関係はありません。

于 2011-02-01T13:18:38.740 に答える
9

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

于 2011-02-01T12:01:29.927 に答える
7

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

于 2011-02-01T11:35:27.050 に答える
3

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;
}
于 2011-02-01T11:39:09.027 に答える
2

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

ustringは他のエンコーディングを utf-8 に自動的に変換しません。Glibライブラリにはこのためのさまざまな変換関数 があります。ただし、文字列が有効な utf-8 であるかどうかを検証できます。

また、ustringstd::stringは交換可能です。つまりustring、 std::string へのキャスト演算子があるため、から構築できるように、が期待されるustring場所でパラメータとして aを渡すことができます。std::stringustringstd::string

于 2011-02-01T13:07:19.897 に答える
2

Qtには、内部で UTF-16 を使用する QString がありますが、std::wstring、UTF-8、Latin1、またはロケール エンコーディングとの間で変換するメソッドがあります。QStrings を基本的に何でも変換できる QTextCodec クラスもあります。しかし、文字列だけに Qt を使用するのはやり過ぎのように思えます。

于 2011-02-01T14:20:42.507 に答える
1

http://grigory.info/UTF8Strings.About.htmlも参照してください。これはUTF8ネイティブです。

于 2013-02-13T16:39:07.860 に答える