文字列をユニコードに変換する

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

カテゴリー「文字列操作」 のエントリー