6

wchar_t*指定された文字列を UTF-16 文字列に変換するには、C++ のコードが必要です。Windows と Linux の両方で動作する必要があります。検索中に多くの Web ページを調べましたが、まだ主題が明確ではありません。

私が理解しているように、次のことが必要です。

  1. setlocaleLC_TYPE および UTF-16 エンコーディングで呼び出します。
  2. UTF-16 文字列wcstombsに変換するために使用します。wchar_t
  3. setlocale以前のロケールを復元するために呼び出します。

wchar_t*ポータブルな方法 (Windows および Linux) で UTF-16 に変換する方法を知っていますか?

4

5 に答える 5

8

C++03 でこれを行うための単一のクロスプラットフォームの方法はありません (ライブラリなしではありません)。これは、wchar_tプラットフォーム間でそれ自体が同じではないためです。Windows ではwchar_t16 ビット値ですが、他のプラットフォームでは多くの場合 32 ビット値です。したがって、それを行うには 2 つの異なるコードパスが必要になります。

于 2012-03-14T06:59:23.930 に答える
5

C++11std::codecvt_utf16は動作するはずです。

std::codecvt_utf16 は std::codecvt ファセットであり、UTF-16 でエンコードされたバイト文字列と UCS2 または UCS4 文字列 (Elem のタイプに応じて) の間の変換をカプセル化します。

これを参照してください: http://en.cppreference.com/w/cpp/locale/codecvt_utf16

于 2012-03-14T06:55:01.957 に答える
3

Windows 以外の世界では、wchar_t は utf-32 であると想定できます。これは Linux と Mac OS X とほとんどの *nix システムに当てはまります (例外はほとんどなく、おそらく触れないシステムでは :-)

また、Windows では wchar_t は utf-16 です。したがって、Windowsでは、変換関数はmemcpyを実行できます:-)

それ以外の場合、変換はアルゴリズム的であり、非常に単純です。したがって、サードパーティのライブラリからの派手なサポートは必要ありません。

基本的なアルゴリズムは次のとおりです: http://unicode.org/faq/utf_bom.html#utf16-3

また、独自の実装を作成したくない場合は、おそらく数十の異なる実装を見つけることができます:-)

于 2012-03-22T09:27:10.207 に答える
2

問題は、wchar_tかなり過小評価されていることです。GNU libiconv を使用して、必要なことを行うことができます。"wchar_t"ソースとターゲットの両方のエンコーディングとして特別なエンコーディング名を受け入れます。そうすれば、Windows と Linux の両方、および libiconv を提供できる他の場所に移植できます。

于 2012-03-14T07:57:15.393 に答える
-1

g++ コンパイラは wcstombs をサポートしているように見えますか?

于 2012-03-14T06:57:32.493 に答える