banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

w_char*とchar *の間の幅広文字と狭い文字の変換

w_char * と char * の変換は windows プログラミングの過程でよく必要とされ、通常インターネットから取得するのは utf-8 エンコーディングですが、windows アプリケーション内では unicode エンコーディングを使用する必要があります。最初は stdlib.h の wcstombs_s と mbstowcs_s のコードを使用して実装しましたが、常に変換に失敗しエラーが発生しました。 char を WCHAR、wchar_t、LPWSTR に、狭文字を広文字に変換する C++ コード

//+------------------------------------------------------------------+
//| char を WCHAR、wchar_t、LPWSTR などに変換 |
//+------------------------------------------------------------------+
static char* WStr2CStr(const wchar_t* WStr)
{
// 長さの設定
size_t len = wcslen(WStr) + 1;
size_t converted = 0;
// 変換対象のオブジェクトを準備
char *CStr;
CStr=(char*)malloc(len*sizeof(char));
// 変換
wcstombs_s(&converted, CStr, len, WStr, _TRUNCATE);
// 戻り値
return CStr;
}

WCHAR、wchar_t、LPWSTR を char に、広文字を狭文字に変換する C++ コード

//+------------------------------------------------------------------+
//| WCHAR、wchar_t、LPWSTR を char に変換 |
//+------------------------------------------------------------------+
static wchar_t* CStr2WStr(const char* CStr)
{
// 長さの設定
size_t len = strlen(CStr) + 1;
size_t converted = 0;
// 変換対象のオブジェクトを準備
wchar_t *WStr;
WStr=(wchar_t*)malloc(len*sizeof(wchar_t));
// 変換
mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE);
// 戻り値
return WStr;
}

その後、windows システム API を調査し、MultiByteToWideChar と WideCharToMultiByte を使用することで問題をうまく解決できることがわかりました。

以下はマイクロソフトの公式サンプルコードで、MultiByteToWideChar と WideCharToMultiByte を使用するには 2 回呼び出す必要があります。1 回は設定する必要のあるバッファの長さを取得し、もう 1 回は変換します。効率は少し低いですが、マイクロソフトのスタイルに合っています。 char を WCHAR、wchar_t、LPWSTR に、狭文字を広文字に変換する C++ コード

//+------------------------------------------------------------------+
//| char を WCHAR、wchar_t、LPWSTR などに変換 |
//+------------------------------------------------------------------+
static wchar_t * CStr2WStr(const char *cStr)
{
// MultiByteToWideChar( CP_ACP, 0, chr,
// strlen(chr)+1, wchar, size/sizeof(wchar[0]) );

    // 最初に: マルチバイト文字列のカウントを取得します。
const DWORD cCh = MultiByteToWideChar(CP\_ACP,           // 文字ページ。
                                      0,                // フラグ、常に0。
                                      cStr,             // マルチバイト文字列。
                                      -1,               // '-1'は長さを自動的に決定します。
                                      NULL,             // 'NULL'は結果を無視することを意味します。これは次の引数が'0'であるためです。
                                      0);               // '0'は翻訳するのではなく、必要な文字のカウントを取得します。

// 次に: 幅広文字で結果を保存するのに十分なメモリを割り当てます。
wchar\_t\* wStr = new wchar\_t\[cCh\];
ZeroMemory(wStr, cCh \* sizeof(wStr\[0\]));

// 三番目に: 翻訳します!
MultiByteToWideChar(CP\_ACP,                             // 文字ページ。
                    0,                                  // フラグ、常に0。
                    cStr,                               // マルチバイト文字列。
                    -1,                                 // 上記の文字列の文字のカウント。
                    wStr,                               // 対象の幅広文字バッファ。
                    cCh);                               // 幅広文字列バッファの文字のカウント。

    return wStr;

}

WCHAR、wchar_t、LPWSTR を char に、広文字を狭文字に変換する C++ コード

//+------------------------------------------------------------------+
//| WCHAR、wchar_t、LPWSTR を char に変換 |
//+------------------------------------------------------------------+
static char* WStr2CStr(const wchar_t *wchar)
{
//WideCharToMultiByte( CP_ACP, 0, wchar, -1,
// chr, length, NULL, NULL );

    const DWORD cCh = WideCharToMultiByte(CP\_ACP,
                                      0,
                                      wchar,
                                      -1,
                                      NULL,
                                      0,
                                      NULL,             // 翻訳されるべき幅広文字がコードページにない場合、procはこれを使用して埋めます。
                                                        // 通常はNULLに設定します。
                                      NULL);            // この変数は翻訳できない文字の数を保存します。通常はNULLに設定します。

// 次に: 結果を保存するのに十分なメモリを割り当てます。
char\* cStr = new char\[cCh\];
ZeroMemory(cStr, cCh \* sizeof(cStr\[0\]));

// 三番目に: 翻訳します!
WideCharToMultiByte(CP\_ACP,
                    0,
                    wchar,
                    -1,
                    cStr,
                    cCh,
                    NULL,
                    NULL);

    return cStr;

}

参考 http://blog.163.com/tianshi\_17th/blog/static/4856418920085209414977/ http://www.cnblogs.com/zhwl/archive/2012/11/23/2784282.html http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。