ユニコード文字列をSHIFT-JISなどの非ユニコード文字列に変換したいときはWideCharToMultiByteをりようする。
この関数を使うときに気をつけなければならないのは、変換先のchar型の文字列に必要なバイト数だ。これはユニコード文字列中の全角文字の数によって可変する。固定長で指定してもいいのだが安全のためにかならず一度WideCharToMultiByteを使って必要なバイト数を取得し、その値を使って動的にメモリを確保してから変換すること。
// // ユニコード文字列をSHIFT-JISなどのANSIやMBCS文字列をに変換 // //取得した結果は必ずdeleteしてメモリを開放すること! // char* ConvertFromUnicode(const WCHAR* pszWchar) { int nLen; char* pszChar; //charに必要な文字数の取得 nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszWchar,-1,NULL,0,NULL,NULL); pszChar = new char[nLen]; if(pszChar == NULL) return NULL; //変換 nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszWchar,wcslen(pszWchar)+1,pszChar,nLen,NULL,NULL); if(nLen) return pszChar; delete pszChar; return NULL; } void Test(void) { int nLen; char* pszChar; WCHAR pszWchar[50]; //変換したいユニコード文字列 wcsncpy(pszWchar,L"ABCあいう",50); pszChar = ConvertFromUnicode(pszWchar); //MessageBoxの第二引数としてcharを与えているのでユニコードビルド時はエラーになるのでifndefで処理 #ifndef UNICODE //変換した非ユニコード文字列を表示 ::MessageBox(NULL,pszChar,_T(""),MB_OK); #endif //必ずdeleteすること! delete pszChar; }プロジェクトファイルをダウンロード