WinMain (멀티바이트 ) -> wWinMain (유니코드)
#include <tchar.h> 유니코드 지원 함수들
L"KGCA_windows" 문자열 앞에 L을 붙이면 유니코드로 문자열로 변경
_T"KGCA_windows" 문자열이 유니코드 OR 멀티바이트 상관 없이 쓸수 있게함
TEXT(문자열) 문자열이 유니코드 OR 멀티바이트 상관 없이 쓸수 있게함
char* 형은 PTSTR이나 LPTSTR형을 쓰고,
const char*형은 PCTSTR,LPCTSTR형을 쓰는 것이 좋다.
유니코드만 지원한다면 T를 W로 바꿔
PWSTR,LPWSTR형을 쓰고 const char*형은 PCWSTR,LPCWSTR형을 쓴다.
PWSTR,LPWSTR형을 쓰고 const char*형은 PCWSTR,LPCWSTR형을 쓴다.
API는 유니코드와 ANSI를 구별하고,변수명과 함수도 각각 나뉘어져 있다.
차이점을 알아 보자.
유니코드는 코드의 1문자 당 영어는 7bit,비 영어는 8bit,한글이나 일본어는 16bit의 값을 지니는데, 이를 모두 16bit로 통일한 것이다. ISO/IEC 10646-1의 문자판에는 일일이 코드 값을 부여하고 있다.
윈도우즈 98까지는 8bit ANSI만을 지원하지만, 윈도우즈 XP/2000 이상은 유니코드와 ANSI를 모두 지원한다.
string.h 헤더 파일은 유니코드 문자 변수를 위해 wchar_t를 정의하고 있다.
typedef unsigned short wchar_t; //2byte로 정의 됨
그러므로 wchar_t str[10]; 같은 경우에 str배열은 10byte가 아닌 20byte가 할당된다.
하지만 ANSI만을 지원하는 플랫폼과의 호환을 위해 wchar_t를 직접 쓰지않고, TCHAR를 정의하고 있다.그러므로 둘 다 쓰려면 TCHAR str[10] 처럼 선언 해 주면 된다.
이와 비슷하게 char* 형은 PTSTR이나 LPTSTR형을 쓰고,
const char*형은 PCTSTR,LPCTSTR형을 쓰는 것이 좋다. 유니코드만 지원한다면 T를 W로 바꿔
PWSTR,LPWSTR형을 쓰고 const char*형은 PCWSTR,LPCWSTR형을 쓴다.
TCHAR *Error = "Error";
Visual C++ 컴파일러는 모든 static 문자열을 유니코드가 아닌 ANSI로 인식한다.
즉 문자열 "Error"은 5byte로 인식하게 된다. 이때 static 문자열도 유니코드로 컴파일하려면
TCHAR *Error = L"Error"; 같이 선언 해 줘야한다.
L은 문자열을 유니코드로 컴파일하라는 것을 지시한다. 그러므로 10byte로 컴파일 된다.
ANSI와 유니코드 모두 자유롭게 컴파일 하고 싶다면, L대신에 _TEXT나 TEXT매크로를 쓰면된다.
TCHAR *Error = TEXT("Error"); // MFC에서는 _T로도 쓸 수 있다.
strcat과 같은 표준 C run-time library 문자열 함수는 오직 ANSI만을 지워한다. 이를 해결하기 위해 유니코드 문자열 함수를 정의 했다.
char zs*strcat(char *,const char*); // 표준 strcat 함수
wchar_t *wcscat(wchar_t*,const wchar_t*); //유니코드 문자열 함수
str대신 wcs를 써준 것이다.
역시 두 가지 모두 사용하려면 _tcs를 붙여서
TCHAR* _tcscat(TCHAR*,const TCHAR*); 를 사용해 주면 된다.
이 외에 API함수 끝에 대문자 W가 붙는 것은 Wide를 나타내며 유니코드를 위한 버전이고 A가 붙은 함수들은 ANSI 문자열을 받는 함수이다.
CreateWindowExA,CreateWindoweExW // 안시,유니코드
사용자는 CreateWindowEx를 선언 해 주면 ANSI용은 ~~A로,유니코드용은 ~~W로 실행이 될 것이다.
sprintf계열의 함수는 아예 분리가 되어 있다.
ANSI -> sprintf
UNICODE -> swprintf
둘 다 -> _stprintf
Win32 API -> wsprintf
차이점을 알아 보자.
유니코드는 코드의 1문자 당 영어는 7bit,비 영어는 8bit,한글이나 일본어는 16bit의 값을 지니는데, 이를 모두 16bit로 통일한 것이다. ISO/IEC 10646-1의 문자판에는 일일이 코드 값을 부여하고 있다.
윈도우즈 98까지는 8bit ANSI만을 지원하지만, 윈도우즈 XP/2000 이상은 유니코드와 ANSI를 모두 지원한다.
string.h 헤더 파일은 유니코드 문자 변수를 위해 wchar_t를 정의하고 있다.
typedef unsigned short wchar_t; //2byte로 정의 됨
그러므로 wchar_t str[10]; 같은 경우에 str배열은 10byte가 아닌 20byte가 할당된다.
하지만 ANSI만을 지원하는 플랫폼과의 호환을 위해 wchar_t를 직접 쓰지않고, TCHAR를 정의하고 있다.그러므로 둘 다 쓰려면 TCHAR str[10] 처럼 선언 해 주면 된다.
이와 비슷하게 char* 형은 PTSTR이나 LPTSTR형을 쓰고,
const char*형은 PCTSTR,LPCTSTR형을 쓰는 것이 좋다. 유니코드만 지원한다면 T를 W로 바꿔
PWSTR,LPWSTR형을 쓰고 const char*형은 PCWSTR,LPCWSTR형을 쓴다.
TCHAR *Error = "Error";
Visual C++ 컴파일러는 모든 static 문자열을 유니코드가 아닌 ANSI로 인식한다.
즉 문자열 "Error"은 5byte로 인식하게 된다. 이때 static 문자열도 유니코드로 컴파일하려면
TCHAR *Error = L"Error"; 같이 선언 해 줘야한다.
L은 문자열을 유니코드로 컴파일하라는 것을 지시한다. 그러므로 10byte로 컴파일 된다.
ANSI와 유니코드 모두 자유롭게 컴파일 하고 싶다면, L대신에 _TEXT나 TEXT매크로를 쓰면된다.
TCHAR *Error = TEXT("Error"); // MFC에서는 _T로도 쓸 수 있다.
strcat과 같은 표준 C run-time library 문자열 함수는 오직 ANSI만을 지워한다. 이를 해결하기 위해 유니코드 문자열 함수를 정의 했다.
char zs*strcat(char *,const char*); // 표준 strcat 함수
wchar_t *wcscat(wchar_t*,const wchar_t*); //유니코드 문자열 함수
str대신 wcs를 써준 것이다.
역시 두 가지 모두 사용하려면 _tcs를 붙여서
TCHAR* _tcscat(TCHAR*,const TCHAR*); 를 사용해 주면 된다.
이 외에 API함수 끝에 대문자 W가 붙는 것은 Wide를 나타내며 유니코드를 위한 버전이고 A가 붙은 함수들은 ANSI 문자열을 받는 함수이다.
CreateWindowExA,CreateWindoweExW // 안시,유니코드
사용자는 CreateWindowEx를 선언 해 주면 ANSI용은 ~~A로,유니코드용은 ~~W로 실행이 될 것이다.
sprintf계열의 함수는 아예 분리가 되어 있다.
ANSI -> sprintf
UNICODE -> swprintf
둘 다 -> _stprintf
Win32 API -> wsprintf
'Programming > Win32 API' 카테고리의 다른 글
| 08. 고해상고 타이머 (0) | 2017.12.20 |
|---|---|
| 0.7. WndProc 메세지 처리 함수 (0) | 2017.12.20 |
| 06. 윈도우크기위치변경함수 (0) | 2017.12.20 |
| 05. 기본 메세지 루프 (0) | 2017.12.20 |
| 04. 윈도우 생성 CreateWindow (0) | 2017.12.20 |
| 03. 윈도우 클래스 구조체 WNDCLASSEX (0) | 2017.12.20 |
| 02. WinMain OR wWinMain 함수 파라미터 해석 (0) | 2017.12.20 |
| 00. WinApi 에서 바뀐 점 (0) | 2017.12.20 |