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, -1NULLNULLNULLNULL);
    szStr = new char[nSize];
    memset(szStr, 0x00, nSize);
    WideCharToMultiByte(CP_ACP, 0, tszTemp, -1, szStr, nSize, NULLNULL);
    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, -1NULLNULLNULLNULL);
    szStr = new char[nSize];
    memset(szStr, 0x00, nSize);
    WideCharToMultiByte(CP_ACP, 0, str, -1, szStr, nSize, NULLNULL);
#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




작성자

Posted by GLORY PAPA

관련 글

댓글 영역