13

std :: codecvtファセットを作成するにはどうすればよいですか?UTF-16からUTF-8に移行し、UTF-16からシステムの現在のコードページ(Windows、つまりCP_ACP)、およびシステムのOEMコードページ(Windows、つまりCP_OEM)に移行するものを作成したいと思います。

クロスプラットフォームが推奨されますが、Windows上のMSVCでも問題ありません。このクラスを正しく使用する方法について、チュートリアルやその性質のものはありますか?

4

2 に答える 2

12

iconvに基づいて作成しました。Windowsまたは任意のPOSIXOSで使用できます。(明らかにiconvとリンクする必要があります)。

楽しみ

「ハウツー」の質問に対する答えは、codecvtリファレンスに従うことです。私は2年前にインターネットでこれ以上の指示を見つけることができませんでした。

重要なお知らせ

  • 理論的にはそのような作業は必要ありません。codecvt_bynameは、標準のサポートプラットフォームで十分なはずです。しかし実際には、このクラスをサポートしていない、またはサポートが不十分なコンパイラがいくつかあります。異なるコンパイラのcodecvt_bynameのインターフェースにも違いがあります。
  • 私の作業例は、codecvtの状態テンプレートパラメーターを使用して実装されています。codecvtを標準のiostreamクラスで使用する唯一の方法であるため、常に標準のmbstateタイプを使用してください。
  • std :: mbstate_tタイプは、クロスプラットフォームの方法で64ビットプラットフォームのポインターとして使用することはできません。
  • ステートレス変換は短い文字列に対して機能しますが、streambufの内部バッファサイズよりも大きいデータチャンクを変換しようとすると失敗する可能性があります(UTFは基本的にステートフルエンコーディングです)
于 2010-06-07T07:27:28.813 に答える
4

このstd::codecvtの問題は、問題を探すための解決策であるということです。むしろ、それが解決しようとしている問題は解決できないので、それを解決策として使おうとする人は誰でも非常に失望するでしょう。

入力または出力がどの文字セットであるかわからない場合は、std::codecvtが役に立ちません。逆に、使用している文字セットがわかっている場合、1回の関数呼び出しでそれらの間を簡単に変換できます。その関数呼び出しを複雑なテンプレートの混乱でラップしても、それらの基本は変わりません。

...そしてそれが誰もstd::codecvtを使用しない理由です。私はあなたが他のみんながすることをすることをお勧めします、そしてそれが決して起こらなかったふりをします。

于 2010-06-07T05:31:44.593 に答える