hahahia

아스키코드 vs 유니코드(02. MBCS와 WBCS의 동시 지원) 본문

Windows Programming/Windows::System

아스키코드 vs 유니코드(02. MBCS와 WBCS의 동시 지원)

hahahia 2012. 3. 2. 14:44


 
1. #include <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;

자료형을 정의하는 이유 
1. 선언의 편리성 
긴 문장을 대신해서 간결하고, 또 의미도 보다 강하게 부여된 이름을 변수 선언시 사용한다.
typedef unsigned int size_t
2. 확장의 용이성 
typedef unsigned char STR_LEN -> typedef unsigned int STR_LEN

(한번의 수정으로 STR_LEN 자료형을 쓰는 모든 변수가 char->int 로 확장되었다 
 

/* 예제 :: WinString.cpp */
#include <stdio.h>
#include <windows.h>

int wmain(int argc, wchar_t* argv[])
{
LPSTR str1 = "SBCS Style String 1";
LPWSTR str2 = L"WBCS Style String 1";

CHAR arr1[] = "SBCS Style String 2";
WCHAR arr2[] = L"WBCS Style String 2";

LPCSTR cStr1 = arr1;
LPCWSTR cStr2 = arr2;

printf("%s\n", str1);
printf("%s\n", arr1);

wprintf(L"%s\n", str2);
wprintf(L"%s\n", arr2);

return 0;
}

실행결과
SBCS Style String 1
SBCS Style String 2 
WBCS Style String 1 
WBCS Style String 2 

2. MBCS와 WBCS를 동시에 지원하기 위한 매크로
 
#define UNICODE
#define _UNICODE

MBCS와 WBCS를 동시에 수용하는 형태의 프로그램을 구현하기 위한 매크로 정의

#ifdef UNICODE                  //UNICODE 매크로가 선언되어 있다면
     typedef WCHAR     TCHAR;
     typedef LPWSTR    LPTSTR;
     typedef LPCWSTR  LPCTSTR;
#else                                //UNICODE 매크로가 선언되어있지 않다면
     typedef CHAR       TCHAR;
     typedef LPSTR      LPTSTR;
     typedef LPCSTR    LPCTSTR;
#endif

TCHAR arr[10];
다음과 같이 선언된 배열이 있다면 
#define UNICODE 라는 매크로를 명시하였다면

WCHAR arr[10], WBCS가 되는것이고, (= wchar_t arr[10])
메크로가 명시되어있지 않는다면
CHAR  arr[10], MBCS가 되게 된다. (= char arr[10])

정리해보면 다음과 같다.

매크로 UNICODE가 정의되면...
TCHAR arr[10]; => WCHAR arr[10]; => wchar_t arr[10];

매크로 UNICODE가 정의되지 않으면...
TCHAR arr[10]; => CHAR arr[10]; => char arr[10]; 

 
(#include<tchar.h>에 선언된 내용)
#ifdef _UNICODE
     #define __T(x)    L ## x
_UNICODE 매크로가 선언되어있을때,
__T("ABC") 이라면 -> L"ABC" 이렇게 붙여주자는 뜻.

#else
     #define __T(x)    x
하지만 _UNICODE가 선언되어있지 않을때에는
__T("ABC") 는 "ABC" 이것과 같게됩니다.

#endif

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

_T(x) , __T(x) , _TEXT(x) 모두 같은의미 입니다. 특히 _T(x)를 많이 사용합니다.

_T("windows"); 라고 선언되어 있을때,
메크로가 있다면
L"windows" 로 WBCS 기반으로 저장되고,
메크로가 없다면
"windows" 로 저장된다.

ex)
/* MBCS_WBCS1.cpp */
#define UNICODE
#define _UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int wmain(void)
{
TCHAR str[] = _T("1234567");
int size = sizeof(str);
printf("string length : %d\n", size); // 출력결과 16
return 0;
}
실행 결과를 보게 되면 TCHAR str[] = _T("1234567")로 선언된 문자열이 유니코드로 처리되었음을 알 수 있다. 
 
3. MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들
 

다음은 tchar.h에 선언되어 있는 함수 이름과 관련된 매크로이다.
활용빈도가 높은 일부 함수에 대해서 참고용으로....
#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_WBCS2.cpp */

#define UNICODE // WBCS지원 이줄과 다음줄을 주석처리하면 MBCS 지원
#define _UNICODE

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(int argc, TCHAR* argv[])
{
LPTSTR str1 = _T("MBCS or WBCS 1");
TCHAR str2[] = _T("MBCS or WBCS 2");
TCHAR str3[100];
TCHAR str4[50];

LPCTSTR pStr=str1;

_tprintf( _T("string size : %d\n"), sizeof(str2)); // 30
_tprintf( _T("string length : %d\n"), _tcslen(pStr)); // 14

_fputts(_T("Input String 1 : "), stdout);
_tscanf(_T("%s"), str3);
_fputts(_T("Input String 2 : "), stdout);
_tscanf(_T("%s"), str4);

_tcscat(str3, str4);
_tprintf(_T("String1 + String2 : %s\n"), str3);

return 0;

출처. 윈도우즈 프로그래밍 | 윤성우 저  | 한빛미디어 
Comments