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

解説

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


使用例


	char		psz[256];
	CStringA	str;

	UnicodeToUTF8(L"あいうえお",psz,256);
	UnicodeToUTF8(L"あいうえお",str);

	//pszやstrが変換されたUTF8文字列



ソースコード


//
//	ユニコード文字列からUTF8文字列に変換
//
bool	UnicodeToUTF8(LPWSTR pwszUnicode,CStringA& strUtf8)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

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

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

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

	return	true;
}

//
//	ユニコード文字列からUTF8文字列に変換
//
bool	UnicodeToUTF8(LPWSTR pwszUnicode,LPSTR pszUtf8,UINT nUtf8Size)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

	if(pszUtf8 && nUtf8Size)
		*pszUtf8 = NULL;
	else
		return	false;

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

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

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

	return	true;
}

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