19

WideCharToMultiByte()とwcstombs()の違いは何ですか?いつどちらを使用するのですか?

4

5 に答える 5

23

簡単に言うと、このWideCharToMultiByte関数は、変換に使用されるエンコーディング/コードページをパラメータリストで公開しますが、公開しwcstombsません。これは主要なPITAです。これは、標準ではを生成するために使用するエンコーディングが定義されていないためwchar_tですが、開発者は、どのエンコーディングに変換するか、またはどのエンコーディングから変換するかを確実に知る必要があります。

それとは別に、WideCharToMultiByteもちろんWindows API関数であり、他のプラットフォームでは使用できません。

したがってWideCharToMultiByte、アプリケーションがWindows以外のOSに移植できるように特別に作成されていない場合は、すぐに使用することをお勧めします。それ以外の場合は、ICUwcstombsなどのフル機能のポータブルUnicodeライブラリの使用に取り組むか、(できればIMHOで)検討することをお勧めします。

于 2011-04-11T11:56:45.693 に答える
13
  • WideCharToMultiByteは、CHARに格納されているWindows定義のマルチバイトコードページと、WCHARに格納されているUTF16を変換するWindowsAPI関数です。使用するコードページは最初のパラメーターとして渡され、CP_ACPとして渡すことができます。これは、システムの現在のロケールに固有のコードページを意味します。これは、コントロールパネルのローカリゼーションツール「非Unicodeプログラムで使用する言語」で設定されます。#includeによってアクセスされ、Windowsでのみ使用できます。

  • wcstombsは、c-runtimesの現在のchar*エンコーディングとwchar_t*エンコーディングの間で変換する標準のCランタイム関数です。setlocale iircを使用して、使用するコードページを設定できます。

  • std :: codecvtは、C ++標準ライブラリテンプレートクラスであり、さまざまな特性タイプのメカニズムを使用してさまざまなエンコーディング間で文字列を変換し、ソースとデスティネーションのエンコーディングを定義するために使用されます。

ICONVやICUなど、さまざまなUnicode<->マルチバイト変換を実行する他のライブラリもあります。

于 2011-04-11T14:16:18.137 に答える
3

他の関数と同様に、プログラムで必要なことを実行する関数を使用します。

WideCharToMultiByteUTF-16(Win32 WCHAR表現として使用)から選択したWin32コードページに変換します。

wcstombs実装定義の内部wchar_t表現から現在の実装定義の内部マルチバイト表現に変換します。

したがって、プログラムが、WCHAR文字列を使用して返す多くのWIN32 API関数を使用するネイティブWin32プログラムである場合は、が必要WideCharToMultiByteです。標準のCwchar_t文字列で動作する標準ライブラリ(Win32 APIではない)に基づいていくつかの関数を作成する場合は、が必要wcstombsです。

于 2011-04-11T14:16:09.617 に答える
2

主な違いは、それwcstombsが標準関数であるため、コードをWindows以外のプラットフォームで実行する必要がある場合に使用します。

于 2011-04-11T11:52:58.503 に答える
2

wcstombs()ポータブルですが、WideCharToMultiByte()関数はwin32のみです。

結局のところwcstombs()、システム固有の関数を呼び出します。これは、Win32では直接呼び出される可能性が高いですが、WideCharToMultiByte()この関数を完全にバイパスして、内部に直接移動する可能性があります。
いずれにせよ、実際的な違いはありません。

于 2011-04-11T11:53:41.403 に答える