본문 바로가기

김탱 개발자/MFC

[퍼옴] MFC에서 사용되는 문자열(멀티바이트/유니코드)에 대한 고찰

Visual Studio  6.0 에서는 유니코드 환경을 제대로 지원해주지 않는다.

 보통 학교에서는 6.0을 사용하기에 유니코드에 대해 잘 모르다 2008을 사용하는데 유니코드라 라이브러리 사용이란 체크 박스가 있어 이게 무엇을 하는 물건이고 .. 찾아보았다

출처 : http://blog.naver.com/niemiskai/100156605903

// 이하 내용


언젠가 한번 정리 해볼까 했는데 질문글에 답변하려다 보니 꽤나 장문이 되어버렸네요..

덕분에 포스트 하나 늘려봅니다..ㅎㅎ

 

일단 MFC에서 문자열이란것이 멀티바이트와 유니코드로 되어있죠... 

멀티바이트는 영문자 1글자에 1바이트를 사용합니다. 

유니코드는 영문자 1글자에 2바이트를 사용합니다.. 

결국 메모리를 어떻게 사용하냐는 결론에 도달하게 되는데요..

 

우리가 코딩을 하게 되면 컴파일러를 통해 기계어로 변환되죠... 

그렇다면 결국 문자열이 멀티바이트인지, 유니코드인지를 컴파일러에게 알려 주어야만 합니다. 

그러기 위해 ""(멀티바이트) 와 L""(유니코드)로 구분합니다.

 

그런데.. 유니코드를 사용해서 L 접두어를 붙여 코딩해 버리면  

멀티바이트로 프로젝트 설정을 바꿨을때 문제가 걸립니다..

 

이런문제를 해결하기 위해 TEXT()/_T() 매크로가 제공되는 겁니다.. 

f12 키를 이용해서 선언을 따라가 보세요...

 

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

 

위와 같은 선언이 되어있습니다.. __T라는 매크로를 다시한번 따라가 봅니다.

 

#ifdef _UNICODE
 #define __T(x)      L ## x
#else
 #define __T(x)      x
#endif

 

대략 위와 같은 선언으로 되어 있습니다. 

UNICODE인경우 L 접두어를 붙이고, 

UNICODE가 아닌경우 그냥 놔둡니다.
(## 문법에 대한것은 찾아보시길 바랍니다.. 전처리기를 공부할 기회가 될것 같네요.)

 

CString도 마찬가지 입니다.. 

따라가 보시면

 

typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;

 

이러한 3가지 선언이 존재합니다. 

TCHAR 라는 타입은 프로젝트 설정에 의존적인 타입이고, 

CStringW,CStringA는 프로젝트 설정에 상관없이 한가지 문자타입을 사용하는 겁니다.. 

보통 사용하실때는 CString을 사용하시는 것이 좋고, 

특정 라이브러리를 사용하실때 해당 라이브러리가 특정 문자열만을 지원한다고 하면 

그때 알맞는 CStringW/CStringA를 선택적으로 사용하시면 되는겁니다.

 

CString str(_T("asdf")); 

이런식으로 선언하신다면 프로젝트 설정에 따라서 알맞은 문자열 타입이 될것입니다.

 

따라서 모든 문자열에는 _T/TEXT 매크로를 사용하는것이 올바른 코딩입니다. 

간혹 예외적인 사항으로 char/wchar_t를 강제로 사용해야 하는부분이  

있다는것을 잊지 않으시면 됩니다.

 

 

참고로 atoi 와 같은 함수들을 많이 사용하실텐데요...

이러한 함수들도 멀티바이트/유니코드 용이 별도로 있습니다.

_ttoi 함수가 atoi/_wtoi 함수를 프로젝트 설정에 따라 선택적으로 바꿔주는 매크로입니다.

모든 변환함수에 대해 매크로가 제공되니 찾아보시면 도움되실겁니다..

 

 

P.S. 1번째

       추가 적으로 BSTR 이라는 타입이 있는데요.. 이건 MFC에서 이야기 하는 유니코드와는 조금 다릅니다.

       bstr에 관한 내용은 여기서 다룰 내용은 아닌것 같네요..ㅎㅎ

P.S. 2번째

       UTF-8 이라는 문자체계가 있습니다. 이것역시 MFC에서 사용하는 유니코드가 아닙니다..

       윈도우에서 사용하는 유니코드는 UTF-16 입니다.

 

 

문자열 변환에 관한 포스팅입니다.

http://blog.naver.com/niemiskai/100156678648

http://blog.naver.com/niemiskai/100195546582