質問

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;

文字列を作成しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top