VS2008을 사용하게되면서 UNICODE와 ANCI간의 스트링 상호변환 함수를 정리한 것입니다.
프로젝트 문자집합 속성(유니코드, 멀티바이트)에 상관없이 변환 가능합니다.
//
// CString → Char
//
char* StringToChar(CString str)
{
char *szStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
int nLen = str.GetLength() + 1;
TCHAR *tszTemp = NULL;
tszTemp = new TCHAR[nLen];
memset(tszTemp, 0x00, nLen*sizeof(TCHAR));
_tcscpy(tszTemp, str);
// Get size (실제사용되는바이트사이즈)
int nSize = WideCharToMultiByte(CP_ACP, 0, tszTemp, -1, NULL, NULL, NULL, NULL);
szStr = new char[nSize];
memset(szStr, 0x00, nSize);
WideCharToMultiByte(CP_ACP, 0, tszTemp, -1, szStr, nSize, NULL, NULL);
if(tszTemp)
{
delete [] tszTemp;
tszTemp = NULL;
}
#else
int nLen = str.GetLength() + 1;
szStr = new char[nLen];
memset(szStr, 0x00, nLen);
strcpy(szStr, str);
#endif
return szStr;
}
//
// CString → TCHAR
//
TCHAR* StringToTCHAR(CString str)
{
TCHAR *tszStr = NULL;
int nLen = str.GetLength() + 1;
tszStr = new TCHAR[nLen];
memset(tszStr, 0x00, nLen*sizeof(TCHAR));
_tcscpy(tszStr, str);
return tszStr;
}
//
// Char → CString
//
CString CharToString(char *str)
{
CString cStr;
#if defined(UNICODE) || defined(_UNICODE)
int nLen = strlen(str) + 1;
TCHAR *tszTemp = NULL;
tszTemp = new TCHAR[nLen];
memset(tszTemp, 0x00, nLen*sizeof(TCHAR));
MultiByteToWideChar(CP_ACP, 0, str, -1, tszTemp, nLen*sizeof(TCHAR));
cStr.Format(_T("%s"), tszTemp);
if(tszTemp)
{
delete [] tszTemp;
tszTemp = NULL;
}
#else
cStr.Format("%s", str);
#endif
return cStr;
}
//
// Char → TCHAR
//
TCHAR* CharToTCHAR(char *str)
{
TCHAR *tszStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
int nLen = strlen(str) + 1;
tszStr = new TCHAR[nLen];
memset(tszStr, 0x00, nLen*sizeof(TCHAR));
MultiByteToWideChar(CP_ACP, 0, str, -1, tszStr, nLen*sizeof(TCHAR));
#else
int nLen = strlen(str) + 1;
tszStr = new TCHAR[nLen];
memset(tszStr, 0x00, nLen*sizeof(TCHAR));
_tcscpy(tszStr, str);
#endif
return tszStr;
}
//
// TCHAR → CString
//
CString TCHARToString(TCHAR *str)
{
CString cStr;
cStr.Format(_T("%s"), str);
return cStr;
}
//
// TCHAR → Char
//
char* TCHARToChar(TCHAR *str)
{
char *szStr = NULL;
#if defined(UNICODE) || defined(_UNICODE)
int nSize = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, NULL, NULL, NULL);
szStr = new char[nSize];
memset(szStr, 0x00, nSize);
WideCharToMultiByte(CP_ACP, 0, str, -1, szStr, nSize, NULL, NULL);
#else
int nLen = strlen(str) + 1;
szStr = new char[nLen];
memset(szStr, 0x00, nLen);
strcpy(szStr, str);
#endif
return szStr;
}