SHIFT-JISの文章などいわゆる普通の文字列をユニコード文字列に変換するにはMultiByteToWideCharを利用する。気をつけなければいけないことは、SHIFT-JISとユニコードとでは文字列の格納に必要なバイト数が異なることだ。そのため、MultiByteToWideCharの第五引数にNULLを渡して、ユニコード文字列にしたときに必要なバイト数を取得し、それを元に動的にメモリを確保する。
例えばSHIFT-JISの文字列をユニコードに変換してメッセージボックスに表示するソースコードは以下のようになる。
void Test(void)
{
int nLen;
char pszChar[50];
WCHAR* pszWchar;
//変換したい非ユニコード文字列
strncpy(pszChar,"ABCあいう",50);
//Unicodeに必要な文字数の取得
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszChar,-1,NULL,0);
pszWchar = new WCHAR[nLen];
//変換
::MultiByteToWideChar(CP_THREAD_ACP,0,pszChar,strlen(pszChar)+1,pszWchar,nLen);
//MessageBoxの第二引数としてWCHARを与えているのでユニコードビルド時以外はエラーになるのでifdefで処理
#ifdef UNICODE
//変換したユニコード文字列を表示
::MessageBox(NULL,pszWchar,_T(""),MB_OK);
#endif
delete pszWchar;
}
プロジェクトファイルをダウンロード
同じ処理を関数的に書くとこんな感じだろうか?
//
// SHIFT-JISなどのANSIやMBCS文字列をユニコード文字列に変換
//
//取得した結果は必ずdeleteしてメモリを開放すること!
//
WCHAR* ConvertToUnicode(const char* pszChar)
{
int nLen;
WCHAR* pszWchar;
//Unicodeに必要な文字数の取得
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszChar,-1,NULL,0);
pszWchar = new WCHAR[nLen];
if(pszWchar == NULL)
return NULL;
//変換
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszChar,strlen(pszChar)+1,pszWchar,nLen);
if(nLen)
return pszWchar;
delete pszWchar;
return NULL;
}
void Test(void)
{
int nLen;
char pszChar[50];
WCHAR* pszWchar;
//変換したい非ユニコード文字列
strncpy(pszChar,"ABCあいう",50);
pszWchar = ConvertToUnicode(pszChar);
//MessageBoxの第二引数としてWCHARを与えているのでユニコードビルド時以外はエラーになるのでifdefで処理
#ifdef UNICODE
//変換したユニコード文字列を表示
::MessageBox(NULL,pszWchar,_T(""),MB_OK);
#endif
//必ずdeleteすること!
delete pszWchar;
}
プロジェクトファイルをダウンロード
