윈도우에서는 많은 언어들을 지원하기 위해서 기존에 1Byte 였던 문자를 2Byte로 늘렸다. 이런 글자들을 Double-Byte Character Set (DBCS)라고 부른다. 이 경우, 첫 번째 바이트의 값이 0x81 ~ 0x9F 혹은 0xE0 ~ 0xFC 일 경우 그 문자가 2바이트를, 그 외에는 1바이트를 차지한다. 이제는 윈도우가 유니코드를 지원하기 떄문에 DBCS에 대해서는 신경 쓰지 않아도 된다
윈도우에서 유니코드 문자의 암호화는 UTF-16을 사용하며, 2바이트룰 사용하지만, 2바이트로 나타내기 힘든 언어의 경우 보조 문자를 사용하여 4바이트를 표현한다.
윈도우에서 기본적으로 문자를 만들면 8비트의 ANSI 문자를 만든다. 하지만 마이크로소프트의 C/C++ 컴파일러에서 wchar_t
데이터 타입을 사용하면 16비트의 유니코드 문자를 만들 수 있다. 유니코드 문자열을 만들 때는 대문자 L을 붙여서 사용한다.
char AnsiString[100] = "An ANSI String";
wchar_t UnicodeString[100] = L"A Unicode String";
또한 윈도우 헤더에서는 아래와 같이 다양하게 정의한다.
// 8-bit
typedef char CHAR;
typedef CHAR *PCHAR;
typedef CHAR *PSTR;
typedef CONST CHAR *PCSTR;
// 16-bit
typedef wchar_t WCHAR;
typedef WCHAR *PWCHAR;
typedef WCHAR *PWSTR;
typedef CONST WCHAR *PCWSTR;
함수의 경우, 보통 ANSI 버전과 UNICODE 버전의 두 가지가 있다. 예를 들어 CreateWindowEx
함수의 경우, Wide Char (UNICODE) 버전인 CreateWindowExW
와 ANSI 버전인 CreateWindowExA
가 있다. 하지만 일반적으로는 아래와 같이 정의 되어있기에, 개발자 입장에서는 그냥 CreateWindowEx
를 사용하면 된다.
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif
StrSafe.h 헤더 파일을 포함시키면 기존의 문자열 함수들은 사용하지 않도록 경고 표시가 뜨게 되고, 새로운 안전함 함수들을 사용하면 된다. _tcscpy
는 _tcscpy_s
로, _tcscat
는 _tcscat_s
로 바뀌는데, 함수의 이름 끝에 _s
가 붙는다. 이 두 함수의 경우, 기존의 함수에 비해 문자 갯수를 인자로 받는데, 이런 Secure 함수들은 가장 먼저 인자들이 유효한지 확인 한 뒤에 실행된다.
이 함수들이 인자의 유효성을 검사할 때, 유효하지 않을 경우 InvalidParameterHandler
함수가 실행 되는데, 이 함수는 임의로 변경이 가능하다. 아래의 프로토타입에 맞는 함수를 정의 한 후에, _set_invalid_parameter_handler
을 호출하면 된다.
void InvalidParameterHandler(PCTSTR expression, PCTSTR function, PCTSTR file, unsigned int line, uintptr_t /*pReserved*/);