C ++でのポータブルwchar_t
-
19-08-2019 - |
質問
C ++には移植可能なwchar_tがありますか? Windowsでは、2バイト。それ以外はすべて4バイトです。アプリケーションでwstringを使用したいのですが、これを移植することを決めた場合、問題が発生します。
解決
プログラム内部での使用を扱っている場合、心配する必要はありません。クラスAのwchar_tはクラスBと同じです。
WindowsバージョンとLinux / MacOSXバージョン間でデータを転送することを計画している場合、wchar_tを超える心配があり、すべての詳細を処理する手段を考え出す必要があります。
どこでも4バイトになるように定義する型を定義し、独自の文字列などを実装できます(C ++のほとんどのテキスト処理はテンプレート化されているため)が、それがどの程度うまく機能するかわかりませんあなたのニーズ。
typedef int my_char; typedef std::basic_string<my_char> my_string;
他のヒント
<!> quot; portable wchar_t <!> quot;とはどういう意味ですか?どこでも16ビット幅のuint16_t
タイプがあり、多くの場合使用可能です。しかし、もちろんそれはまだ文字列を構成していません。文字列は、length()
、substring()
などの機能を理解するためにエンコードを知っている必要があります(したがって、utf8または16を使用する場合、コードポイントの途中で文字をカットしません)。あなたが使用できることを知っているいくつかのユニコード互換の文字列クラスがあります。すべては商用プログラムで無料で使用できます(Qt 4.5は、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を使用する必要があります。
SQLite APIにはUTF-8バージョンもあります。 <=>違いを処理する代わりに、それを使用することもできます。
私の提案。 UTF-8とstd :: stringを使用します。幅の広い文字列を使用しても、付加価値はあまりありません。とにかく、いくつかの文字がいくつかのUnicodeコードポイントから作成されているため、ワイド文字を文字として解釈することはできません。
したがって、UTF-8をどこでも使用し、自然言語を扱うために適切なライブラリを使用します。たとえばBoost.Localeなど。
悪い考え:typedef uint32_t mychar;
のようなものを定義するのは悪いことです。 iostreamを使用することはできないため、この文字に基づいて文字列ストリームを作成することはできません。書き込みができないためです。
たとえば、これは機能しません:
std::basic_ostringstream<unsigned> s;
ss << 10;
文字列を作成しません。