본문 바로가기

Programming/Win32 API

01. 유니코드 OR 멀티바이트 문자 지원 여부 따라 대체 방법

01. 유니코드 OR 멀티바이트 문자 지원 여부 따라 대체 방법

     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형을 쓴다.

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