MBCS와 WBCS의 동시 지원

 WBCS 기반의 개발이 여러가지로 장점이 많지만 기존 개발 된 프로그램과의  호환성,

사용자 시스템의 유니코드 지원여부에 때문에 프로그램 개발에 이써 MBCS와 WBCS을 동시에 지원하는 프로그램을 개발 하여야 한다.


#include<windows.h>

Windosws 정의 자료형

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.h 안에는 이런 식으로 자료형이 정의되있는데 실제 개발에 있어서 꼭 이런식의 자료형을 사용하지는 않으므로 이정도만 알아두자. 


MBCS와 WBCS 동시 지원 매크로 

#ifdef UNICODE

  typedef  WCHAR     TCHAR;

  typedef  LPWSTR    LPTSTR;

  typedef  LPCWSTR  LPCTSTR;

#else 

 typedef   CHAR        TCHAR;

 typedef   LPSTR       LPTSTR;

 typedef   LPCSTR     LPCTSTR;

#endif

windows.h 보면 위와같은 매크로가 선언되어 있다.


만약  매크로 UNICODE 가 정의됬을 경우 


TCHAR arr[10];    →    WCHAR arr[10];     →    wchar_t arr[10];


매크로 UNICODE 가 정의되지 않았을 경우

 

TCHAR arr[10];    →    CHAR arr[10] ;       →    char arr[10];


이런식으로 처리가 된다.

이 매크로를 통하여 손쉽게 MBCS와 WBCS를 동시에 지원하는 프로그램을 개발 할 수있다.


#ifdef _UNICODE

     #define __T(x)   L ## x

#else

     #define __T(x)   x


#define _T(x)       __T(x)

#define _TEXT(x) __T(x)


WBCS 기반의 문자열을 선언 할 때 L"ABC" 이런식으로 정의하는것을 위한 매크로가 위의 매크로 이다. 

  #define __T(x)   L ## x  이 부분의 ## 처리자는 L과 x를 붙이라는 의미이다. 

매크로 _UNICODE 가 정의됬을 경우


_T("ABC");   __T("ABC");   L"ABC";


매크로 _UNICODE 가 정의되지 않았을 경우


_T("ABC");   __T("ABC");   "ABC";


매크로가 정의 되어있을떄를 보면 문자열이 WBCS로 치환되고

매크로가 정의 되지않았을 때 MBCS 기반으로 해석된다. 


#define _T(x)       __T(x)

#define _TEXT(x) __T(x)

이 부분은 _T(x), __T(x), _TEXT(x) 어떤걸 쓰던 상관은 없지만 주로 _T(x)를 쓴다.



예제 2-6]

#define UNICODE

#define _UNICODE


int wmain(void){


TCHAR str[]=_T("1234567");

int size=sizeof(str);

printf("string length : %d \n",size);                         실행결과

return 0;                                                               string length : 16

}

간단한 예제를 통하여 매크로를 정의했을때  TCHAR str[]=_T("1234567");부분이 유니코드 처리가 되었다는 사실을 결과값을 통하여 알 수있다.

(문자 7개에 null값포함 각각 2byte씩 이므로 문자열의 길이가 16이다.)

※유니코드에서 null값도 2byte이다. 나만 모르던 사실 일 수 있다.



MBCS와 WBCS 동시 지원 함수

#ifdef _UNICODE 
  #define _tmain      wmain 
  #define _tcslen     wcslen 
  #define _tcscat     wcscat 
  #define _tcscpy    wcscpy 
  #define _tcsncpy  wcsncpy
  #define _tcscmp   wcscmp 
  #define _tcsncmp  wcsncmp
  #define _tprintf      wprintf 
  #define _tscanf     wscanf 
  #define _fgetts      fgetws 
  #define _fputts      fputws
#else 
  #define _tmain      main 
  #define _tcslen     strlen 
  #define _tcscat     strcat 
  #define _tcscpy    strcpy 
  #define _tcsncpy  strncpy
  #define _tcscmp   strcmp 
  #define _tcsncmp  strncmp
  #define _tprintf      printf 
  #define _tscanf     scanf 
  #define _fgetts      fgets 
  #define _fputts      fputs
#endif 


많이 쓰는 MBCS와 WBCS 동시 지원하는 함수이다.




+ Recent posts