MBCS 와 WBCS 동시지원
MBCS 는 기존 작성된 프로그램과의 호환성, Unicode 를 지원하지 못하는 환경에서 프로그램을 동작시킬때와 같은 이유로, WBCS 의 장점에도 불구하고 WBCS 로만 프로그램을 작성할 수 없다.
서버프로그램은 문제가 되지 않는다. 서버는 업데이트가 편리하고. 개인에게 요구 하지 않기 때문이다.
기업을 대상으로 하는 프로그램은 WBCS기반 프로그래밍이 가능하다. 하지만 최종 클라이언트(유저) 고려하면, MBCS 와 WBCS 동시지원하는 프로그램을 만드는게 좋다. 만약 MBCS, WBCS 기반의 프로그램을 각각 만든다면, 하나의 프로그램인데 두개가 존재하기때문에 하나바꾸면 다른 하나를 또 바꿔야하기때문에 유지보수가 어렵고, 배포하는과정에서도 문제가 나타난다.
이러한 이유로 MBCS 와 WBCS 를 동시지원하는 프로그램을 구현하는것이 좋다고 할 수 있다.
윈도우에서는 이를 위한 다양한 매크로를 제공한다.
windows.h 에 windows 정의 자료형
typedef char CHAR
typedef wchar_t WCHAR
#define CONST const
typedef CHAR* LPSTR
typedef CONST CHAR* LPCSTR
typedef WCHAR* LPWSTR
typedef CONST WCHAR* LPCWSTR
이렇게 자료형 네이밍은, 팀, 프로젝트, 회사 마다 다르게 할 수 도 있다. 선언된 자료형말고,
windows 의 typedef 선언 자체를 이해해야한다.
MBCS 와 WBCS 동시지원 매크로
#ifdef UNICODE
typedef WCHAR TCHAR;
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef CHAR TCHAR;
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
#ifdef _UNICODE
#define __T(x) L##x
#else
#define __T(x) x
#endif
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
이 부분을 보자.
#define __T(x) L##x
여기에서 ## 는 L 과 x 를 붙이라는것이다.
example : __T("hello") -> L"hello"
_UNICODE 정의 여부에 따른
example :
_UNICODE 정의시 : _T("hello") -> __T("hello") -> L"hello"
정의되지 않았으면 : _T("hello") -> __T("hello") -> "hello"
예제 :
#define UNICODE
#define _UNICODE
int wmain(void){
TCHAR str[]=_T("123456");
printf("%d",sizeof(str));
return 0;
}
출력값은 wchar_t 문자열로 처리되어 14 가 나온다. (널문자도 2바이트 사용)
MBCS 와 WBCS 함수 동시지원하기위한 매크로
#ifdef _UNICODE
#define _tmain wmain
#define _tcslen wcslen
#define _tprintf wprintf
#define _tscanf wscanf
#else
#define _tmain main
#define _tcslen strlen
#define _tprintf printf
#define _tscanf scanf
_UNICODE 정의 여부에 따라 _tmain 이 main 또는 wmain 으로 치환된다.
MBCS 와 WBCS 를 동시지원할려면 앞에있는 함수( _tmain, _tcslen 등 ) 를 사용해야한다.
MBCS 와 WBCS 동시지원 프로그램 예시 :
int _tmain(void){
LPTSTR str1=_T("hello");
TCHAR str2[]=_T("hello");
TCHAR str3[100];
TCHAR str4[50];
LPCTSTR pStr = str1;
_tprintf(_T("string size %d length %d"),sizeof(str2),_tcslen(pStr));
_fputts(_T("input please :"),stdout);
_tscanf(_T("%s"),str3);
}
UNICODE 정의 시 자료형 설명 :
LPTSTR = wchar_t*
TCHAR = wchar
LPCTSTR = const wchar_t*
#윤성우 윈도우 시스템 프로그래밍을 BASE로 제작되었습니다.