ユニコード文字列を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;
}
プロジェクトファイルをダウンロード
