본문 바로가기

프로그래밍/위도우 시스템

Win System Programming

윤성우의 윈도즈 시스템 프로그래밍 유튜브 강의로 공부를 하고 있다. char 자료형으로 문자열을 많이 사용했는데

영어는 1바이트이고 한글은 2바이트임으로 안전성을 확보하기 위해 모든 문자를 2바이트로 표현하는 유니코드를 사용한다.

 

SBCS(single byte character set) : 아스키 1바이트

MBCS(multi byte character set) : 한글 2바이트, 영문 1바이트 -> 우리가 평소에 썼던 것

WBCS(Wide byte character set) : 유니코드 문자 2바이트 사용

 

char str [ ] = "ABC한글";

int size = sizeof(str);  -> 8 (1*3 + 2*2 + null문자)

int len = strlen(str);  -> 7 (한글은 2바이트라..)

오류남

유니코드 대체 함수

wchar_t str [ ] = L"ABC";

문자열에 L을 붙여 아스키 문자열을 유니코드 문자열로 인식할 수 있다.

printf -> wprintf를 사용한다.

main -> wmain

 

MBCS와 WBCS를 동시에 지원하는 게 여러 입장에서 보면 좋다.

 

#ifdef UNICODE

    typedef   WCHAR     TCHAR;

    typedef   LPWSTR     LPTSRT;

    typedef   LPCWSTR   LPCTSTR;

#else

    typedef    CHAR    TCHAR;

    typedef    LPSTR    LPTSTR;

    typedef    LPCSTR    LPCTSTR;

#endif

 

 

#include <windows.h> 안에는

윈도 정의 자료형

typedef char -> CHAR;

typedef wchar_t -> WCHAR; 

 

#define CONST  ->  const

typedef CHAR*  ->  LPSTR;

typedef CONST CHAR*  ->  LPCSTR;

 

typedef WCHAR*  ->  LPWSTR;

typedef CONST  WCHAR*  ->  LPCWSTR;

 

 

매크로 UNICODE가 정의되면..

TCHAR arr [10];    ->    WCHAR arr [10];    ->    wchar_t arr[10];

 

매크로 UNICODE가 정의되어 있지 않으면..

TCHAR arr[10];    ->    CHAR arr[10];    ->    char arr[10];

 

#ifdef _UNICODE

    #define __T(x)  L##x

#else

    #define __T(x)  x

#endif

 

#define _T(x)    __T(x)  //_UNICODE선언과 상관없다.

#define _TEXT(x)   __T(x)

 

매크로 _UNICODE가 정의되면..

_T("HANBIT"); ->  __T("HANBIT")  ->  L"HANBIT"  //wbcs

매크로 _UNICODE가 정의되어 있지 않으면..

_T("HANBIT");  ->  __T("HANBIT")  ->  "HANBIT"  //mbcs

 

#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

#endif

 

최종정리 : 아스키와 유니코드모두 호환하는 코드를 만들려고 define을 사용한다.

'프로그래밍 > 위도우 시스템' 카테고리의 다른 글

Win System Programming  (0) 2020.02.24
Win System Programming  (0) 2020.02.22
Win System Programming  (0) 2020.02.22
Win System Programming  (0) 2020.02.21
Win System Programming  (0) 2020.02.19