UTF8からユニコードへの変換

解説

 Internet Explorer系のコンポーネントであるIMultiLanguage2を利用すると 様々なコードページ間で文字列の変換ができる。ここではUTF8からユニコード へ変換する方法について紹介する。


使用例


	char		psz[256];
	WCHAR		pwsz[256];
	CStringW	ustr;

	//テスト用にUTF8文字列を作成
	//関数の実装は「ユニコードからUTF8への変換」を参照のこと。
	UnicodeToUTF8(L"あいうえお",psz,256);

	UTF8ToUnicode(psz,ustr);
	UTF8ToUnicode(psz,pwsz,256);

	//pwszやustrが変換されたユニコード文字列



ソースコード


//
//	UTF8文字列からユニコード文字列に変換
//
bool	UTF8ToUnicode(LPSTR pszUtf8,CStringW& ustrUnicode)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

	::CoCreateInstance(CLSID_CMultiLanguage,NULL,CLSCTX_ALL,IID_IMultiLanguage2,(void**)&pMultiLanguage);
	if(pMultiLanguage == NULL)
	{
		ATLASSERT(0);		//::CoInitialize(NULL);が実行されていない!
		return	false;
	}

	nSrcLen = (strlen(pszUtf8) + 1) * sizeof(char);
	dwMode	= 0;
	nDstLen	= 0;
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,NULL,&nDstLen);	//バッファサイズ取得
	if(FAILED(hr))
		return	false;

	ustrUnicode.GetBufferSetLength(nDstLen);
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,(BYTE*)ustrUnicode.GetBuffer(nDstLen),&nDstLen);	//変換
	if(FAILED(hr))
	{
		ustrUnicode = L"";
		return	false;
	}

	return	true;
}



//
//	UTF8文字列からユニコード文字列に変換
//
//	nUnicodeLengthは文字数で指定(バイト数ではない!)
//
bool	UTF8ToUnicode(LPSTR pszUtf8,LPWSTR pwszUnicode,UINT nUnicodeLength)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

	if(pwszUnicode && nUnicodeLength)
		*pwszUnicode = NULL;
	else
		return	false;

	::CoCreateInstance(CLSID_CMultiLanguage,NULL,CLSCTX_ALL,IID_IMultiLanguage2,(void**)&pMultiLanguage);
	if(pMultiLanguage == NULL)
	{
		ATLASSERT(0);		//::CoInitialize(NULL);が実行されていない!
		return	false;
	}

	nUnicodeLength *= sizeof(WCHAR);
	nSrcLen = (strlen(pszUtf8) + 1) * sizeof(char);
	dwMode	= 0;
	nDstLen	= 0;
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,NULL,&nDstLen);	//バッファサイズ取得
	if(FAILED(hr) || (nDstLen > nUnicodeLength))
		return	false;

	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,(BYTE*)pwszUnicode,&nUnicodeLength);	//変換
	if(FAILED(hr))
		return	false;

	return	true;
}

カテゴリー「VC++ TIPS」 のエントリー