-----------------------------------------------------------------------
SBCS 1byte win9X, NT \0
-----------------------------------------------------------------------
MBCS 1byte(영문), 2byte(한글) winNT \0
-----------------------------------------------------------------------
UNICODE 2byte winNT,CE \0\0
-----------------------------------------------------------------------
Unicod와 MBCS/ANSI에 따라서 따로 구분해서 프로그램할 필요가 없도록 하기위해서
사용하는 것이 TCHAR 매크로임
즉, TCHAR 타입이 _UNICODE가 정의된 경우에는 wchar_t 타입으로 작동하고,
_MBCS가 정의된 경우에는 char 타입으로 작동한다.
(TCHAR 을 나타는 매크로가 _T 이다. (한문자 _T(' '), 문장 _T(" "))
#include <tchar.h>
#define _UNICODE // ==> TCHAR를 wchar_t 형으로 대치
#define _MBCS // ==> TCHAR를 char 형으로 대치 (default)
[ 타입 정의 ]
#ifdef UNICODE
typedef wchar_t TCHAR; // 2byte
#else
typedef char TCHAR; // 1byte
#endif
[ 함수 정의 ]
#ifdef UNICODE
typedef SetWindowTextW SetWindowText;
#else
typedef SetWindowTextA SetWindowText;
#endif
UNICODE가 정의 되면,
--------------------------------------------------------
TCHAR == wchar_t
TEXT == _TEXT == L
_UNICODE가 정의 되면,
--------------------------------------------------------
TCHAR == wchar_t
_T == __T == _TEXT == L
따라서 UNICODE, _UNICODE가 모두 정의 되어야 한다.
_MBCS가 정의 되면,
--------------------------------------------------------
TCHAR == char
_T == __TEXT == 사라짐
UNICODE, _UNICODE, _MBCS 중 어느것도 정의 되지 않으면,
--------------------------------------------------------
TCHAR == char
_T == __TEXT == 사라짐
[ 예) 상수 문자열 ]
LPTSTR lpszStr = "My string"; // 문자열을 ANSI 문자열로 간주,
// 데이터형 불일치로 에러가 발생한다.
TCHAR *lpszStr = T("My string");
LPTSTR lpszStr = _T("My string"); // _UNICODE가 정의되어 있으면 _T()는 유니코드
// 문자열 상수로 변환하고, _MBCS가 정의되어 있으면
// ANSI 문자열 상수로 변환한다.
LPTSTR lpszStr = TEXT("My string"); // 상동
LPWSTR lpszStr = L("My string"); // 유니코트 문자열로 지정하는 매크로 함수 L()
[ 예) 문자열 버퍼 길이 계산 ]
#define _UNICODE
TCHAR szBuffer[200]; // szBuffer의 크기는 400 bytes
DWORD dwlen;
dwlen = sizeof(szBuffer); // 400 bytes
dwlen = sizeof(szBuffer) / sizeof(TCHAR); // 실제 저장 가능한 유니코드 문자 개수는 200개
[ 예) 표준 문자열 라이브러리 함수 ]
표준 C 런타임 함수 strlen()에 해당하는 유니코드 함수는 wcslen()이지만,
_tcslen()을 사용하면 _UNICODE, _MBCS 정의에 따라 컴파일시에 알아서 적절히 변환된다.
(tchar.h에 다 정의되어 있다.)
ANSI Unicode TCHAR type
--------------------------------------
strlen() wcslen() _tcslen()
strcat() wcscat() _tcscat()
strchr() wcschr() _tcschr()
strcmp() wcscmp() _tcscmp()
strcpy() wcscpy() _tcscpy()
strstr() wcsstr() _tcsstr()
strrev() _wcsrev() _tcsrev()
printf() wprintf() _tprintf()
sprintf() swprintf() _stprintf()
scanf() wscanf() _tscanf()
[ 예) ANSI 문자열과 Unicode 문자열 간의 변환 ]
(1) Multi-Byte String을 Wide Character String(유니코드)으로 변환
mbstowcs(WCHAR *des, char *src, int BufferSize);
(2) Wide Character String(유니코드)을 Multi-Byte String으로 변환
wcstombs(char *des, WCHAR *src, int BufferSize);
[ 타입 정의 ]
typedef CHAR * LPSTR, *PSTR;
CHAR * == LPSTR == PSTR
typedef CONST CHAR * LPCSTR, *PCSTR;
CONST CHAR * == LPCSTR == PCSTR
LPTSTR = TCHAR *
LPCTSTR = CONST TCHAR *
출처 : http://alpu.egloos.com/2968362/ |
'프로그래밍 > C++' 카테고리의 다른 글
ID3DXSprite Flush() Function (0) | 2020.06.19 |
---|---|
WideCharToMultiByte - 유니코드를 멀티바이트로 (0) | 2019.01.31 |
VisualStudio - usersuppliedvalue error (0) | 2017.08.14 |
[link] C++ Unit Test - VisualStudio (0) | 2017.04.25 |
C++17 string_view (0) | 2017.04.13 |