C/C++中char*とwchar_t*のいくつかの変換方法


オリジナル記事、転載は出典を明記してくださいhttps://blog.csdn.net/aaron_lyn1985/article/details/80053910
マルチバイト(char*)とワイド文字(wchar_t*)の変換にはいくつかの方法がありますが、以下では汎用から特殊までの順序で逐一紹介します.
1.Cライブラリ関数
1.1キー関数
(1)setlocale()機能:地域化ヘッダファイルの構成:
関数のプロトタイプ:
char *setlocale (int category, const char * locale); 

関数パラメータ:
category:ローカライズされたコンテンツを設定します.次の値を使用します.
LC_ALLは以下のすべてのオプションを含みます.
LC_COLLATE構成文字列比較
C_CTYPEは文字カテゴリと変換を構成し、例えば全変大文字strtoupper()
LC_MONETARY金融通貨の構成
LC_NUMERIC配置小数点以下の桁数
LC_TIME設定時間日付フォーマット、strftime()と併用
locale:この地域番号の戻り値を示します.NULLの場合は現在のlocale名(一般的にC)を返します.空でない場合はcategoryとlocaleに従って設定し、成功した場合は新しいlocale名(地域名)を返し、失敗した場合はNULLを返します.
(2)wcstombs_s()機能:ワイド文字符号化文字列をマルチバイト符号化文字列ヘッダファイルに変換: 
関数のプロトタイプ:
errno_t __cdecl wcstombs_s(size_t * _PtNumOfCharConverted, char * _Dst, size_t _DstSizeInBytes, const wchar_t * _Src, size_t _MaxCountInBytes);

関数パラメータ:PtNumOfCharConverted:変換された文字列の長さに終止符(単位バイト)Dstを付ける:変換された文字列の先頭アドレスDstSizeInBytesを指す:宛先アドレス最大バイト空間(単位バイト)_Src:ソース幅文字列ヘッダ_MaxCountInBytes:最大格納可能なマルチバイト文字列バッファのバイト数変換後の文字列戻り値を切り取る:0に成功し、失敗すると失敗コードを返す
(3)mbstowcs_s()関数機能:マルチバイト符号化文字列をワイド文字符号化文字列ヘッダファイルに変換する:
関数のプロトタイプ:
errno_t __cdecl mbstowcs_s(size_t * _PtNumOfCharConverted, wchar_t * _DstBuf, size_t _SizeInWords, const char * _SrcBuf, size_t _MaxCount );

パラメータの説明:PtNumOfCharConverted:変換された文字列の長さに終止符(単位wchar_t)_DstBuf:変換された文字列の先頭アドレスを指す_SizeInWords:宛先アドレス最大文字空間サイズ(単位wchar_t)_SrcBuf:ソースマルチバイト文字列ヘッダアドレス_MaxCount:最大幅文字列バッファに格納可能な文字数変換後の幅文字列を切り取る
戻り値:0が正常に返され、失敗すると失敗コードが返されます.
1.2例
インスタンスはC++で実装され、stringとwstringをパラメータまたは戻り値として使用するため、内部ではstringをchar*に変換し、wstringをwchar_に変換します.t*
Cバージョンが必要な場合は、関数の内部char*とwchar_を切り取るだけです.t*互いに部分を変換すればよい
#include 
#include 
#include 
using namespace std;

string ws2s(const wstring& ws)
{
    size_t convertedChars=0;
    string curLocale=setlocale(LC_ALL,NULL); //curLocale="C"
    setlocale(LC_ALL,"chs");
    const wchar_t* wcs = ws.c_str();
    size_t dByteNum=sizeof(wchar_t)*ws.size()+1;
    cout<

2.Windows API
Windowsプラットフォームでは、Windowsが提供するAPIを使用して変換できます.
2.1キー関数
(1)WideCharToMultiByte()機能:ワイド文字列をマルチバイト文字列ヘッダファイルに変換する:
関数のプロトタイプ:
WINAPI
WideCharToMultiByte(
    _In_ UINT CodePage,
    _In_ DWORD dwFlags,
    _In_NLS_string_(cchWideChar) LPCWCH lpWideCharStr,
    _In_ int cchWideChar,
   _Out_writes_bytes_to_opt_(cbMultiByte, return) LPSTR lpMultiByteStr,
    _In_ int cbMultiByte,
    _In_opt_ LPCCH lpDefaultChar,
    _Out_opt_ LPBOOL lpUsedDefaultChar
);

関数パラメータ:CodePage:変換を実行するコードページ文字セットを指定します.オペレーティングシステムにインストールまたは有効なコードページ文字セットを指定します.また、次のいずれかの値を指定します.CP_ACP:ANSIコードページ;CP_ACP:ANSIコードページ;CP_MACCP:Macintoshコードページ;CP_OEMCP:OEMコードページ;CP_SYMBOL:シンボルコードページ;CP_THREAD_ACP:現在のスレッドANSIコードページ;CP_UTF 7:UTF-7変換を使用する.CP_UTF 8:UTF-8変換を使用します.最も多く使われているのがCP_ACPとCP_UTF8;dwFlags:変換に成功していない文字の処理方法を指定します.このパラメータ(0に設定)を設定しないと、関数はより速く動作します.UTF-8の場合、dwflagsは0またはWC_ERR_INVALID_CHARSでなければなりません.そうしないと、関数は失敗して戻り、エラーコードERROR_INVALID_FLAGSを設定します.GetLastErrorを呼び出してlpWideCharStrを取得できます.ワイド文字列に変換されるcchWideChar:変換されるワイド文字列の長さ(文字数),-1は文字列末尾に変換されたlpMultiByteStrを表します:変換後の文字列バッファcbMultiByte:宛先文字列バッファサイズ(単位バイト).0に設定すると、関数は必要なバッファサイズを返し、lpMultiByteSt lpDefaultCharを無視します.文字へのポインタは、指定された符号化に該当する文字が見つからない場合にデフォルト文字として使用されます.NULLの場合はシステムデフォルト文字が使用されます.dwFlagsを使用する場合はこのパラメータは使用できません.そうしないと、ERROR_INVLID_PARAMMETERエラーlpUsedDefaultChar:デフォルト文字が使用されているかどうかを示すスイッチ変数のポインタ.このパラメータがNULLであることを要求するdwflagsに対してこのパラメータを使用すると、関数は失敗して戻り、エラーコードERROR_を設定します.INVLID_PARAMETER.lpDefaultCharもlpUsedDefaultCharもNULLに設定すると、関数がより速くなります
戻り値:関数が正常に実行され、cbMultiByteがゼロでない場合、戻り値はlpMultiByteStrが指すバッファに書き込まれたバイト数です.関数が正常に実行され、cbMultiByteがゼロの場合、戻り値は格納先の文字列バッファに接続するために必要なバイト数です.関数の実行に失敗した場合、戻り値はゼロです.エラーの詳細については、GetLastError関数を呼び出します.
(2)MultiByteToWideChar()機能:マルチバイト文字列から金バイト文字列への変換;ヘッダファイル:
関数のプロトタイプ:
int WINAPI MultiByteToWideChar(
    _In_ UINT CodePage,
    _In_ DWORD dwFlags,
    _In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr,
    _In_ int cbMultiByte,
    _Out_writes_to_opt_(cchWideChar, return) LPWSTR lpWideCharStr,
    _In_ int cchWideChar
);

関数パラメータ:CodePage:同上;dwFlags:制御文字の代わりに象形文字を使用するかどうか、無効な文字を処理する方法を指定します.UTF-8の場合、dwflagsは0またはWC_でなければなりません.ERR_INVALID_CHARS、そうでない場合、関数は失敗してエラーコードERROR_を返し、設定します.INVALID_FLAGSは、GetLastErrorを呼び出してlpMultiByteStrを得ることができる:マルチバイト文字列cbMultiByte:変換されるマルチバイト文字列長、-1は文字列の最後に変換されるlpWideCharStrを表す:変換されたワイド文字列バッファcchWideCharを格納する:ワイド文字列バッファのサイズ(単位文字数)
戻り値:関数が正常に実行され、cchWideCharがゼロでない場合、戻り値はlpWideCharStrが指すバッファに書き込まれた文字数です.関数が正常に実行され、cchWideCharがゼロの場合、戻り値は格納先の文字列バッファに接続するために必要な文字数です.関数の実行に失敗した場合、戻り値はゼロです.エラーの詳細については、GetLastError関数を呼び出します.
2.2例
#include 
#include 
using std::cout;
using std::wcout;
using std::locale;
using std::endl;

int main()
{
    //       
    wchar_t *pws = L"      ABC";
    //      NULL,                 (    ,     )
    int bufSize = WideCharToMultiByte(CP_ACP,NULL,pws,-1,NULL,0,NULL,FALSE);
    cout<

2.3 locale設定について
locale(すなわちシステム領域設定、すなわち国または地域設定)は、プログラムが使用する現在の言語符号化、日付フォーマット、数値フォーマット、およびその他の領域に関する設定を決定し、locale設定の正しいかどうかは、プログラム中の文字列処理(wchar_tがどのように出力されるか、strftime()のフォーマットなど)に影響する.
C localeとC++localeは独立しています.C localeはsetlocale(LC_CTYPE,")で初期化します.
C++localeはstd::locale::global(std::locale("))で初期化します.これにより、現在の実行環境に基づいてlocaleを正しく設定できます.
その他の詳細については、C++のlocale設定を参照してください.
3.Winidows ATL
ATLは2つの変換マクロA 2 W()とW 2 A()を定義し、char*とwchar_でより便利にすることができる.t*間変換.
ヘッダファイル:
USES_CONVERSION;  

char sz[] = "     string";
wchar_t *pWChar = A2W(sz);  

wchar_t wsz[] = L"     string";
char *pChar = W2A(wsz);

備考:1.USES_を先に呼び出す必要がありますCONVERSIONマクロは、パラメータ定義がここにあるため
          2. 変換マクロの内部はスタックの空間のメモリを使って、最大の2 M、だから循環して呼び出しないでオーバーフローを防止します;A 2 W()とW 2 A()を括弧で呼び出すことをお勧めします