본문 바로가기

C/C++

멀티바이트 <-> 유니코드



나는 지금 멀티바이트와 유니코드를 변환하는데, 큰 애로사항을 겪고 있다.

CA2W를 사용하여 변환하였더니, 어떤 컴퓨터(한국어 윈도우즈)에서는 동작하지 않는다.

MultiByteToWideChar를 사용하여 변환하였더니 영문 윈도우에서 동작하지 않는다.


MultiByteToWideChar와 관련한 아래의 해결책을 찾아서 블로그에 정리하였다.



티바이트 코드를 유니코드로 변경할 때 다음과 같은 방법이 있다.


wchar_t* pszUnicode = NULL;

int len = ::MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pszUnicode, 0);


pszUnicode = new wchar_t[len+1]();

::MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pszUnicode, len);


그런데, 이 코드가 영문 윈도우에서는 한글이 깨져 버린다.

CP_ACP는 현재 자신의 윈도우 OS 언어셋으로 처리하기 때문이다.

즉, 한국어 윈도우즈면 EUC-KR로 영문이면 영어로, 일본어면 EUC-JP로 동작한다. [1]


이런 문제를 막으려면 CP_ACP 대신 한국어 코드 페이지(949)를 넣어주어 멀티바이트를 변환할 때

코드 페이지를 참조하도록 해주어야 한다.


::MultiByteToWideChar(949, 0, pszMultiByte, -1, pszUnicode, len);



한, CA2W도 마찬가지로

CString wstr = CA2W(cstr, 949);

한글 코드페이지 949를 넣어주면 된다.

그런데, 이 컴퓨터는 한국어 윈도우즈인데 왜 이러는지..



리고 3번째 방법.

 #include <locale.h>

 setlocale(LC_ALL, "korean"); //이걸 빠트리면 한글이 깨져서 나온다.

int size = mbstowcs(wcstr, cstr, wlen);


그리고 CString.h에 이런것도 있다.

 int size = _mbstowcsz(wcstr, cstr, wlen);





<출처>

1. http://charsyam.tistory.com/54

2. http://m.arzz.com/devforum/c.arzz?mode=view&p=14&idx=199276