WindowsプログラミングでのTCHARの扱い方

TCHARでは代入などの際に " " ではなく、_T(" ") を利用していることに注意。

変数の宣言時に文字列を指定することもできる。
////////////////////////////////
//初期文字列代入
//
TCHAR	pszSrc[] = {_T("abcdあいう")};
文字数の取得にstrlenは利用できない。_tcslenを利用する。
////////////////////////////////
//文字数取得
//
size_t	nLen1 = ::_tcslen(pszSrc);			//変数内の文字列の文字数取得
size_t	nLen2 = ::_tcslen(_T("あいうえ"));	//指定した文字列の文字数取得
文字列のコピーにstrcpyは利用できない。_tcscpyをより安全にした_tcscpy_sを利用する。
////////////////////////////////
//文字列代入
//
TCHAR	pszText[256];
::_tcscpy_s(pszText,256 * sizeof(TCHAR),_T("あいうえABCD"));	//直接代入
::_tcscpy_s(pszText,256 * sizeof(TCHAR),pszSrc);				//変数から代入
CStringはTCHARを扱うための文字列操作クラスだ。
////////////////////////////////
//TCHAR*からCStringへの変換
//
CString	strText1(pszText);
CString	strText2 = pszText;
ユニコードビルド時はTCHAR=WCHARとなる。そのときは文字列の変換に失敗する可能性がある。
////////////////////////////////
//TCHAR*からCStringA(char型のCString)への変換
//
CStringA	strTextA(pszText);			//コンストラクタを利用
この場合は文字列の変換に失敗することはない。
////////////////////////////////
//TCHAR*からCStringW(WCHAR型のCString)への変換
//
CStringW	strTextW(pszText);			//コンストラクタを利用
この場合もWCHARからcharへの変換が起きる可能性があるので注意する。
////////////////////////////////
//TCHAR*からchar*へ変換
//
//TCHARはプロジェクト設定によってはWCHAR、charのどちらかになるので
//ifdefで分岐処理する
{
	TCHAR	pszTchar[] = {_T("abcdあいう")};
	char*	pszChar;
#ifdef UNICODE
	{
		int		nLen;

		//charに必要な文字数の取得
		nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszTchar,-1,NULL,0,NULL,NULL);
		pszChar = new char[nLen];
		if(pszChar)
		{
			//変換
			nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszTchar,(int)::wcslen(pszTchar)+1,pszChar,nLen,NULL,NULL);
			if(nLen == 0)
			{
				delete	pszChar;
				pszChar = NULL;
			}
		}
	}
#else
	{
		size_t	nLen;

		nLen = ::_tcslen(pszTchar) + 1;
		pszChar = new char[nLen];
		if(pszChar)
			::strcpy_s(pszChar,nLen * sizeof(char),pszTchar);
	}
#endif
	//
	//ここでchar*型のpszCharを任意の処理で利用
	//
	delete	pszChar;		//処理が終わったらdelete
}
この場合は変換に失敗することはない。
////////////////////////////////
//TCHAR*からWCHAR*へ変換
//
//TCHARはプロジェクト設定によってはWCHAR、charのどちらかになるので
//ifdefで分岐処理する
{
	TCHAR	pszTchar[] = {_T("abcdあいう")};
	WCHAR*	pszWchar;
#ifdef UNICODE
	{
		size_t	nLen;

		nLen = ::_tcslen(pszTchar) + 1;
		pszWchar = new WCHAR[nLen];
		if(pszWchar)
			::wcscpy_s(pszWchar,nLen * sizeof(WCHAR),pszTchar);
	}
#else
	{
		int		nLen;

		//Unicodeに必要な文字数の取得
		nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszTchar,-1,NULL,0);
		pszWchar = new WCHAR[nLen];
		if(pszWchar)
		{
			//変換
			nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszTchar,(int)::strlen(pszTchar)+1,pszWchar,nLen);
			if(nLen == 0)
			{
				delete	pszWchar;
				pszWchar = NULL;
			}
		}
	}
#endif
	//
	//ここでWCHAR*型のpszWcharを任意の処理で利用
	//
	delete	pszWchar;		//処理が終わったらdelete
}

トラックバック

この一覧は、次のエントリーを参照しています: WindowsプログラミングでのTCHARの扱い方:

» ユニコードからANSIへ変換 送信元 プログラマー's雑録
LPSTR  szAnsi; int len = ::WideCharToMultiByte(CP_ACP, 0, szUnicode... [詳しくはこちら]


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