훈, IT 공부/C,C++,MFC

[C++] 멀티바이트 -> 유니코드 변환을 위한 4가지 방법

IT훈이 2020. 6. 5.
반응형

 개발을 하다보면 멀티바이트 유니코드 변환을 해줘야하는 경우가 너무나도 많다. 프로젝트가 멀티바이트로 만들어져있는 경우에 유니코드 문자열을 처리해야한다면 변환을 해야하고, 소켓 통신을 할때는 멀티바이트 형태를 사용해서 또 변환을 해줘야하는 경우도있다. 데이터를 받는쪽이 중국이나 일본, 헝가리일 경우에도 변환을 해서 패킷을 보내주어야한다. 그렇지 않을경우에는 데이터 수신자는 깨져있는 데이터를 받아 처리하게 된다.


#1번째

USES_CONVERSION;

// 1번
std::wstring wstr = "UNICODE";

// UNICODE -> MULTIBYTE
std::string str;
str.assign(wstr.begin(), wstr.end());

// MULTIBYTE -> UNICODE
std::wstring wwstr;
wwstr.assign(str.begin(), str.end());

#2번째

USES_CONVERSION;
		
// 2번
std::wstring wstr = "UNICODE";

// UNICODE -> MULTIBYTEz
CW2A cw2a(wstr.c_str());
std::string a_str = cw2a;
		
// MULTIBYTE -> UNICODE
CA2W ca2w(a_str.c_str());
std::wstring w_str = ca2w;

3번째

USES_CONVERSION;
        
// 3번
WCHAR *pszWCHAR = NULL;
pszWCHAR = new WCHAR[Arg6*2];
wmemcpy(pszWCHAR, Arg5, Arg6);

int nSize = WideCharToMultiByte(CP_UTF8, 0, pszWCHAR, -1, NULL, 0, NULL, NULL);
char *pszCHAR = NULL;
pszCHAR = new char[nSize];
WideCharToMultiByte(CP_UTF8, 0, pszWCHAR, -1, pszCHAR, nSize, NULL, NULL);
        
delete []pszWCHAR;
delete []pszCHAR;
        

4번째

USER_CONVERSION
        
// 4번 
// WCHAR -> CHAR 변환 
std::wstring wstr = "UNICODE";
char *pszChar= NULL;
int nBytes = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
pszChar = (char*)malloc(sizeof(char) * nBytes + 1);
memset(pszChar, 0x00, nBytes + 1);
strncpy(pszChar, W2A(wstr.c_str()), nBytes);
	
// CHAR -> WCHAR 변환
wchar_t *pszWchar = NULL;
nBytes = MultiByteToWideChar(CP_ACP, 0, pszChar, strlen(pszChar), NULL, 0);
pszWchar = (wchar_t *)malloc(sizeof(wchar_t) * nBytes + 1);
memset(pszWchar, 0x00, nBytes + 1);
wcsncpy(pszWchar, A2W(pszChar), nBytes);
      
free(pszChar);
free(pszWchar);
반응형

댓글