ユニコード文字列から非ユニコード(SHIFT-JIS)文字列に変換する

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

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