5


1

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

4 Answer


4


プログラムの内部使用を扱っているのであれば、心配しないでください。クラスAのwchar_tはクラスBと同じです。

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

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

`typedef int my_char;のようなものです。 typedef std

basic_string my_string; `


3


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

http://www.gtkmm.org/ [gtkmm]プロジェクトのhttp://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/classGlib_1_1ustring.html [` ustring`]プロジェクト。 もしあなたがgtkmmでプログラムしたりglibmmを使ったりするなら、それが最初の選択であるべきです、それは内部で utf-8`を使います。 http://qt.nokia.com/ [`Qt]にはQStringという文字列クラスもあります。 それは utf-16`でエンコードされています。 http://www.icu-project.org/ [`ICU]は移植可能なUnicode文字列クラスを作成するもう一つのプロジェクトで、Qtのように内部的にutf-16でエンコードされているような` UnicodeString`クラスを持ちます。 しかし、それを使ったことはありません。


1


提案されている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
標準によれば、整数型についてはhttp://gcc.gnu.org/onlinedocs/libstdc /manual/bk01pt05ch13s03.html [char_traits]を特殊化する必要があります。 しかし、Visual Studio 2005では、特別な処理なしで `std

basic_string`を廃止しました。

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

それなら `wchar_t`ではなくUTF-16を使う必要があるでしょう。

SQLite APIにはUTF-8バージョンもあります。 `wchar_t`の違いを扱う代わりにそれを使いたいかもしれません。


0


私のおすすめ。 UTF-8とstd

stringを使用してください。 広い文字列では、あまり価値がありません。 あなたがとにかくワイド文字を文字として解釈することはできません。いくつかの文字はいくつかのUnicodeコードポイントから生成されたものです。

だから、どこでもUTF-8を使い、自然言語を扱うのに良いライブラリを使う。 例えばBoost.Localeのように。

悪い考え:typedef `uint32_t mychar;`のようなものを定義するのは悪いことです。 iostreamを一緒に使用することはできませんので、この文字を基にした文字列ストリームなどは作成できません。書き込みができないためです。

例えばこれはうまくいかないでしょう:

std::basic_ostringstream s;
ss << 10;

あなたに文字列を作成しないでしょう。