C++ に移植可能な wchar_t はありますか? Windows では、2 バイトです。それ以外はすべて 4 バイトです。アプリケーションで wstring を使用したいのですが、これを移植することに決めた場合、問題が発生します。
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;
「ポータブルwchar_t」とはどういう意味ですか?uint16_t
どこでも16ビット幅のタイプがあり、それはしばしば利用可能です。しかし、もちろんそれはまだ文字列を構成していません。length()
文字列は、などの関数を理解するためにそのエンコーディングを認識している必要がありますsubstring()
(したがって、utf8または16を使用する場合、コードポイントの途中で文字をカットしません)。私が知っているUnicode互換の文字列クラスがいくつかあります。すべて無料で商用プログラムで使用できます(Qt 4.5がリリースされると、数か月以内に無料で商用プログラムと互換性があります)。
ustring
gtkmm
プロジェクトから。gtkmmでプログラムするか、glibmmを使用する場合、それが最初の選択肢であるはずです。これはutf-8
内部で使用されます。Qt
QStringと呼ばれる文字列クラスもあります。でエンコードされていutf-16
ます。ICU
は、ポータブルUnicode文字列クラスを作成する別のプロジェクトであり、UnicodeString
Qtのように内部的にutf-16でエンコードされているように見えるクラスがあります。しかし、それを使用していません。
提案された C++0x 標準にはchar16_t
、char32_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
。
私のおすすめ。UTF-8 と std::string を使用します。幅の広いストリングは、あまり付加価値をもたらさないでしょう。とにかく、いくつかのユニコードコードポイントから作成された一部の文字として、ワイド文字を文字として解釈することはできません。
したがって、どこでも UTF-8 を使用し、適切なライブラリを使用して自然言語を処理します。たとえば、Boost.Locale のように。
悪い考え: typedef のようなものを定義するのuint32_t mychar;
は悪いことです。iostream を使用できないため、たとえば、この文字に基づいて stringstream を作成することはできません。これは、書き込みができないためです。
たとえば、これは機能しません。
std::basic_ostringstream<unsigned> s;
ss << 10;
文字列を作成しません。