文字列を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; }