文字列をUTF8に変換するにはいくつかの方法がある。今回はATLライブラリに備わるインライン関数「AtlUnicodeToUTF8」を利用した。
AtlUnicodeToUTF8はユニコード文字列をUTF8文字列に変換するためのものだ。そのため変換元の文字列をユニコードビルド/非ユニコードビルドで場合分けし、非ユニコードビルドの場合は一度ユニコードに変換してからUTF8に変換して使う。
ここでは使いやすいようにTCHAR文字列をUTF8文字列に変換する関数を用意した。
#include "atlstr.h"
#include "atlenc.h"
//
// 文字列をUTF8に変換する
//
//UTF8文字列はCAtlStringA(char*)型として返ることに注意!
//
bool ConvertToUTF8(LPCTSTR pszText,CAtlStringA* pstrUTF8)
{
int nLen;
int nSrc;
char* pszUTF8;
if(pstrUTF8 == NULL)
return false;
*pstrUTF8 = "";
if(pszText == NULL || *pszText == NULL)
return false;
#ifdef UNICODE
{
nSrc = (int)::_tcslen(pszText);
nLen = AtlUnicodeToUTF8(pszText,nSrc,NULL,0);
if(nLen == 0)
return false;
nLen++;
pszUTF8 = new char[nLen];
if(pszUTF8 == NULL)
return false;
nLen = AtlUnicodeToUTF8(pszText,nSrc,pszUTF8,nLen);
}
#else
{
CAtlStringW ustrText;
//変換元文字列をcharからユニコードに変換する
ustrText = pszText;
nSrc = ustrText.GetLength();
nLen = AtlUnicodeToUTF8(ustrText,nSrc,NULL,0);
if(nLen == 0)
return false;
nLen++;
pszUTF8 = new char[nLen];
if(pszUTF8 == NULL)
return false;
nLen = AtlUnicodeToUTF8(ustrText,nSrc,pszUTF8,nLen);
}
#endif
pszUTF8[nLen] = NULL;
*pstrUTF8 = pszUTF8;
delete pszUTF8;
return (nLen == 0) ? false : true;
}
bool Test(void)
{
bool ret;
CAtlStringA strText;
ret = ConvertToUTF8(_T("abcあいう"),&strText);
if(ret == false)
return false;
::MessageBox(NULL,(CAtlString)strText,_T(""),MB_OK);
return true;
}
