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