解説
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;
}