5

C++ に移植可能な wchar_t はありますか? Windows では、2 バイトです。それ以外はすべて 4 バイトです。アプリケーションで wstring を使用したいのですが、これを移植することに決めた場合、問題が発生します。

4

4 に答える 4

4

プログラム内部での使用を扱っている場合は、心配する必要はありません。クラスAのwchar_tは、クラスBのwchar_tと同じです。

WindowsとLinux/MacOSXのバージョン間でデータを転送することを計画している場合は、wchar_t以上のことを心配する必要があり、すべての詳細を処理する手段を考え出す必要があります。

どこでも4バイトと定義する型を定義し、独自の文字列などを実装することもできます(C ++でのほとんどのテキスト処理はテンプレート化されているため)が、それがニーズにどれだけうまく機能するかはわかりません。

何かのようなものtypedef int my_char; typedef std::basic_string<my_char> my_string;

于 2009-01-21T21:52:08.173 に答える
3

「ポータブルwchar_t」とはどういう意味ですか?uint16_tどこでも16ビット幅のタイプがあり、それはしばしば利用可能です。しかし、もちろんそれはまだ文字列を構成していません。length()文字列は、などの関数を理解するためにそのエンコーディングを認識している必要がありますsubstring()(したがって、utf8または16を使用する場合、コードポイントの途中で文字をカットしません)。私が知っているUnicode互換の文字列クラスがいくつかあります。すべて無料で商用プログラムで使用できます(Qt 4.5がリリースされると、数か月以内に無料で商用プログラムと互換性があります)。

ustringgtkmmプロジェクトから。gtkmmでプログラムするか、glibmmを使用する場合、それが最初の選択肢であるはずです。これはutf-8内部で使用されます。QtQStringと呼ばれる文字列クラスもあります。でエンコードされていutf-16ます。ICUは、ポータブルUnicode文字列クラスを作成する別のプロジェクトであり、UnicodeStringQtのように内部的にutf-16でエンコードされているように見えるクラスがあります。しかし、それを使用していません。

于 2009-01-21T21:50:42.483 に答える
1

提案された C++0x 標準にはchar16_tchar32_t型と型があります。wchar_tそれまでは、文字型以外の整数の使用に頼る必要があります。

#if defined(__STDC_ISO_10646__)
    #define WCHAR_IS_UTF32
#elif defined(_WIN32) || defined(_WIN64)
    #define WCHAR_IS_UTF16
#endif

#if defined(__STDC_UTF_16__)
    typedef _Char16_t CHAR16;
#elif defined(WCHAR_IS_UTF16)
    typedef wchar_t CHAR16;
#else
    typedef uint16_t CHAR16;
#endif

#if defined(__STDC_UTF_32__)
    typedef _Char32_t CHAR32;
#elif defined(WCHAR_IS_UTF32)
    typedef wchar_t CHAR32;
#else
    typedef uint32_t CHAR32;
#endif

char_traits標準によると、整数型に特化する必要があります。しかし、Visual Studio 2005 では、std::basic_string<CHAR32>特別な処理をしなくても済みました。

SQLite データベースを使用する予定です。

次に、ではなく、UTF-16 を使用する必要がありますwchar_t

SQLite API には UTF-8 バージョンもあります。違いに対処する代わりに、それを使用することをお勧めしますwchar_t

于 2010-08-20T13:08:53.337 に答える
0

私のおすすめ。UTF-8 と std::string を使用します。幅の広いストリングは、あまり付加価値をもたらさないでしょう。とにかく、いくつかのユニコードコードポイントから作成された一部の文字として、ワイド文字を文字として解釈することはできません。

したがって、どこでも UTF-8 を使用し、適切なライブラリを使用して自然言語を処理します。たとえば、Boost.Locale のように。

悪い考え: typedef のようなものを定義するのuint32_t mychar;は悪いことです。iostream を使用できないため、たとえば、この文字に基づいて stringstream を作成することはできません。これは、書き込みができないためです。

たとえば、これは機能しません。

std::basic_ostringstream<unsigned> s;
ss << 10;

文字列を作成しません。

于 2010-08-20T13:16:06.633 に答える