XML은 UTF-8 을 표준 인코딩 방식을 사용하기 때문에 한글을 사용할 경우 인코딩 변환 과정이 필요하다.
유니코드를 사용할 경우 2 바이트를 사용하지만 UTF-8 같은 경우 1-4바이트가 사용된다.
1. MFC의 CString을 사용하는 방법
char szTempStr [ ] = "1234가나다라";
CStringW wStr (szTempStr); // CStringW에서 알아서 Unicode문자열로 변경해 준다.
WCHAR wszTempStr [ ] = L"1234가나다라";
CStringA aStr (wszTempStr);
상당히 간단하지만 MFC에서만 쓸 수 있다는 단점이 있다.
2. Windows API를 사용하는 방법
MultiByteToWideChar / WideCharToMultiByte 를 사용해서 변경하는 방법으로 가장 보편적이지만
API 특징인 수많은 파라미터 때문에 처음 쓰는 사람은 어려워 하기도 한다.
Windows 95의 경우 유니코드를 지원하지 않기 때문에 Windows95의 경우 직접 구현해야 한다.
지금은 거의 무시해도 되지만 초기에는 UnicoWS.DLL (MSLU: Microsoft Layer for Unicode)을 배포하여 문제를 해결하기도 했다.
WOW (Blizzard World Of Warcraft)의 경우 실행 디렉토리에 가보면 Unicows.dll 파일이 있을 것이다.
3. ATL을 사용하는 방법
헤더파일 AtlBase.h 을 포함한다.
USES_CONVERSION; 매크로를 먼저 사용해야만 한다.
A2W, W2A // MultiByteChar 를 WideChar 로 서로 변경한다.
T2A, T2W // TChar 를 WideChar 로 서로 변경한다.
UTF8로 변경하려면 MultiByte Char 을 먼저 WideChar로 변경후 CP 를 CP_UTF8로 바꿔서 다시 MultiByte Char 로 변경해야 한다.
마찬가지로 UTF8을 MultiByte Char로 변경할 경우에도 WideChar로 변경하는 과정이 필요하다.
A2W_CP , W2A_CP 매크로를 사용해서 CP_UTF8을 사용하면 쉽게 UTF8로 변경할 수 있다.
이 매크로는 메모리를 alloca를 사용하여 할당하기 때문에 함수(스택)내에서만 유효하다.
즉 매크로가 리턴하는 값을 함수밖으로 리턴하는 것은 무의미하다.
5. STL의 codecvt를 이용한 방법도 있다.
참고 자료 : http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/codecvt.html
6. 예제
ATL과 API를 혼용하여 사용하여 만들었다.
문자열 변경하는 예제 코드
![](https://t1.daumcdn.net/cfile/cafe/176157154B15DD6F25)
문자열을 확인하기 위해 Watch 창에 출력한 것이다.
![](https://t1.daumcdn.net/cfile/cafe/186157154B15DD6F26)