文字列をUTF8に変換する

文字列をUTF8に変換するにはいくつかの方法がある。今回はATLライブラリに備わるインライン関数「AtlUnicodeToUTF8」を利用した。

AtlUnicodeToUTF8はユニコード文字列をUTF8文字列に変換するためのものだ。そのため変換元の文字列をユニコードビルド/非ユニコードビルドで場合分けし、非ユニコードビルドの場合は一度ユニコードに変換してからUTF8に変換して使う。
ここでは使いやすいようにTCHAR文字列をUTF8文字列に変換する関数を用意した。

依存環境:ATL
#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;
}

プロジェクトファイルをダウンロード


カテゴリー「文字列操作」 のエントリー