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
}
