WideCharToMultiByte()とwcstombs()の違いは何ですか?いつどちらを使用するのですか?
5 に答える
簡単に言うと、このWideCharToMultiByte
関数は、変換に使用されるエンコーディング/コードページをパラメータリストで公開しますが、公開しwcstombs
ません。これは主要なPITAです。これは、標準ではを生成するために使用するエンコーディングが定義されていないためwchar_t
ですが、開発者は、どのエンコーディングに変換するか、またはどのエンコーディングから変換するかを確実に知る必要があります。
それとは別に、WideCharToMultiByte
もちろんWindows API関数であり、他のプラットフォームでは使用できません。
したがってWideCharToMultiByte
、アプリケーションがWindows以外のOSに移植できるように特別に作成されていない場合は、すぐに使用することをお勧めします。それ以外の場合は、ICUwcstombs
などのフル機能のポータブルUnicodeライブラリの使用に取り組むか、(できればIMHOで)検討することをお勧めします。
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<->マルチバイト変換を実行する他のライブラリもあります。
他の関数と同様に、プログラムで必要なことを実行する関数を使用します。
WideCharToMultiByte
UTF-16(Win32 WCHAR表現として使用)から選択したWin32コードページに変換します。
wcstombs
実装定義の内部wchar_t
表現から現在の実装定義の内部マルチバイト表現に変換します。
したがって、プログラムが、WCHAR文字列を使用して返す多くのWIN32 API関数を使用するネイティブWin32プログラムである場合は、が必要WideCharToMultiByte
です。標準のCwchar_t文字列で動作する標準ライブラリ(Win32 APIではない)に基づいていくつかの関数を作成する場合は、が必要wcstombs
です。
主な違いは、それwcstombs
が標準関数であるため、コードをWindows以外のプラットフォームで実行する必要がある場合に使用します。
wcstombs()
ポータブルですが、WideCharToMultiByte()
関数はwin32のみです。
結局のところwcstombs()
、システム固有の関数を呼び出します。これは、Win32では直接呼び出される可能性が高いですが、WideCharToMultiByte()
この関数を完全にバイパスして、内部に直接移動する可能性があります。
いずれにせよ、実際的な違いはありません。