윈도우 - 02. 문자와 문자열

최준영·2021년 6월 1일
0

윈도우 공부

목록 보기
2/4

윈도우에서는 많은 언어들을 지원하기 위해서 기존에 1Byte 였던 문자를 2Byte로 늘렸다. 이런 글자들을 Double-Byte Character Set (DBCS)라고 부른다. 이 경우, 첫 번째 바이트의 값이 0x81 ~ 0x9F 혹은 0xE0 ~ 0xFC 일 경우 그 문자가 2바이트를, 그 외에는 1바이트를 차지한다. 이제는 윈도우가 유니코드를 지원하기 떄문에 DBCS에 대해서는 신경 쓰지 않아도 된다

윈도우에서 유니코드 문자의 암호화는 UTF-16을 사용하며, 2바이트룰 사용하지만, 2바이트로 나타내기 힘든 언어의 경우 보조 문자를 사용하여 4바이트를 표현한다.

ANSI, 유니코드, 문자열 데이터

윈도우에서 기본적으로 문자를 만들면 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

문자열 Secure 함수

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*/);
profile
다양하게 이것저것 배우는 개발자입니다.

0개의 댓글