나는 지금 멀티바이트와 유니코드를 변환하는데, 큰 애로사항을 겪고 있다.
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