0

bufと を使用して、UTF-16 文字列 ( buffer に配置)を処理しようとしてstd::basic_stringいますistringstreamstd::bad_castこのコードでは例外が発生します。私のコードに問題はありますか? それとも、gcc の STL はunsigned int(16 ビット) シンボルを扱えないのでしょうか?

const unsigned short * buf;
// ... fiilling buf
std::basic_string<unsigned short> w(buf);
std::basic_istringstream<unsigned short> iss(w);

unsigned int result;
try { iss >> result; }
catch (std::exception& e)
{
   const char * c = e.what();
}

同じコードがstd::wstringと でstd::wistringstream正しく動作します。

4

1 に答える 1

1

charおよび とは異なる文字タイプでの IOStreams のインスタンス化wchar_tはかなり重要です。ストリームには、多数のstd::localeファセットが存在する必要があります。それらがなければ、それらは適切に機能しません。操作を試行するには、少なくとも次のものが必要です。

  • std::ctype<cT>
  • std::numpunct<cT>
  • std::num_get<cT>

cTストリームの文字タイプです。これらの最後の 1 つはインスタンス化のみが必要ですが、他のものは実装する必要があります。もちろん、std::localeグローバル ロケールとして設定するか、 を使用して、ストリーム用に がインストールされていることを確認する必要もありますstream.imbue()

ただし、個人的には、これは全体的に間違ったアプローチだと思います。システムに入るときに文字を内部表現に変換し、システムを離れるときに文字を外部表現に変換する必要があります (それがstd::codecvt<...>ファセットの目的です)。しかし、これは負け戦であり、人々はエンコーディングを内部的にいじりたいと思っているようです。

于 2013-10-07T12:35:36.013 に答える