MFC 유니코드(UNICODE) 멀티바이트(ANCI) 문자열 변환함수
Develop2018. 12. 4. 10:33
Visual Studio에서 유니코드를 지원함에 따라 유니코드 문자열과 멀티바이트 문자열 사이에서 타입 변환을 사용해야 할 때가 매우 빈번히 발생합니다. 예를 들여, 유니코드 프로젝트로 생성하여 스트링 처리를 모두 CString으로 구현하였는데, 통신 모듈로 보내기위해 Char 문자열로 변환하게 되는 경우입니다. 유니코드 프로젝트의 CString은 유니코드 문자열로, 멀티바이트 Char 문자열과는 문자 형식이 달라 일반적인 형 변환 시 문자열이 깨지는 등의 문제가 발생합니다. 따라서 유니코드와 멀티바이트 간 변환하는 함수가 필요합니다.
다음은 유니코드(UNICODE)와 멀티바이트(ANCI)간의 스트링 상호변환 함수를 정리한 것입니다. 현재 작업하시는 프로젝트 문자집합 속성(유니코드, 멀티바이트)에 상관없이 편리하게 사용가능 합니다.
유니코드 ↔ 멀티바이트 문자열 변환함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | /************************************************************************/ /* 유니코드 ↔ 멀티바이트 문자열 변환함수 정의부 */ /************************************************************************/ static char* StringToChar(CString str); // CString → Char static TCHAR* StringToTCHAR(CString str); // CString → TCHAR static std::string StringToStdString(CString str); // CString → std::string static CString CharToString(char *str); // Char → CString static TCHAR* CharToTCHAR(char *str); // Char → TCHAR static CString TCHARToString(TCHAR *str); // TCHAR → CString static char* TCHARToChar(TCHAR *str); // TCHAR → Char /************************************************************************/ /* 유니코드 ↔ 멀티바이트 문자열 변환함수 구현부 */ /************************************************************************/ // // 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_s(tszTemp, nLen, 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_s(tszStr, nLen, str); return tszStr; } // // CString → std::string // std::string StringToStdString(CString str) { std::string stdStr; char *szStr = StringToChar(str); if(szStr) { stdStr = szStr; delete [] szStr; } return stdStr; } // // 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; } | cs |
변환함수 사용 예
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // // StringToStdString 사용 예 // CString strUnicode = _T("유니코드 문자열"); std::string szMultibyte = StringToStdString(strUnicode); // // StringToChar 사용 예 // CString strUnicode = _T("유니코드 문자열"); char * szMultibyte = StringToChar(strUnicode); printf("%s", szMultibyte); // 포인터 형식으로 반환하는 변환 함수를 사용한 경우 // 문자열을 사용한 뒤 delete로 메모리를 해제해야 합니다. if (szMultibyte) { delete [] szMultibyte; } // // CharToString 사용 예 // std::string szMultibyte = "멀티바이트 문자열"; CString strUnicode = CharToString((char *)szMultibyte.c_str()); | cs |
'Develop' 카테고리의 다른 글
MFC 명령 프롬프트(CMD) 실행 및 결과 스트링 반환 (0) | 2018.11.30 |
---|---|
MFC 숫자 3자리 단위마다 콤마 넣기 (1) | 2018.11.28 |
[NODE.JS] SMS API를 적용해보자 - COOLSMS (0) | 2018.11.08 |
MFC 특정 윈도우 화면 캡쳐/미러링 기능 (1) | 2018.11.07 |
미리컴파일된 OpenSSL (0) | 2018.11.04 |
댓글 영역