3. 윈도우 내의 유니코드 함수와 ANSI 함수

윈도우 NT 버젼 이후는 유니코드를 기반으로 작성됨.

ANSI 문자열을 전달하면 호출된 함수는 유니코드로 변경후에 운영체제에 이를 전달한다. (시간/메모리 낭비) 


윈도우에서- 문자열 인자가 있는 함수의 경우 두버젼으로 제공하는 게 일반적. 


CreateWindowExW (Wide) / CreateWindowExA ( ANSI )


이를 이용하는 것이 아니라 유니코드 사용 여부에 따라 위 함수를 전처리기를 통해 분기하는 함수를 이용하는 것이 일반적.


#ifdef UNICODE

#define CreateWindowExW CreateWindowExW

..


CreateWindowExA 는 유니코드를 변환한후 CreateWindowExW 를 호출하는 형태로 구현되어 있다. 

-> 즉 더 많은 메모리와 시간 소요 


몇몇 윈도우 API 는 16비트 윈도우용으로 제작된 프로그램과의 호환성을 위해서만 유지되고 있어 ANSI 문자열만을 지원.

즉, 이런 함수는 개발시에 사용하지 않아야한다.



2. ANSI 문자와 유니코드 문자 그리고 문자열 자료형

char 형은 8 비트 ANSI 문자 표현을 위해 존재.

16비트 유니코드 표현을 위한 wchar_t 자료 형을 built-in 타입으로 사용할 수 있다.  ( 과거에는 컴파일러 스위치가 필요했음 /Zc:wchar_t )


wchar_t c = L'A';


대문자 L 이 유니코드 문자열로 다루게끔 해준다. 

데이터 섹션에 들어가게 될때 인코딩된다. 아스키문자인 경우 각 문자 사이에 0이 삽입된다.


윈도우는 C 언어의 자료형과, 윈도우 자료형을 구분하기 위해 WinNT.h 에 따로 정의한다.


typedef char CHAR;

typedef wchar_t WCHAR;


//8bit

typedef CHAR *PCHAR;

typedef CHAR *PSTR;

typedef CONST CHAR *PCSTR;


//16bit

typedef WCHAR *PWCHAR;

typedef WCHAR *PWSTR;

typedef CONST WCHAR *PCWSTR;


문자/문자열을 가리키는 포인터에 대해서도 별도로 정의하고 있음.


컴파일시 ANSI 문자나 유니코드를 사용하도록 변경가능하게 전처리기를 이용하여 작성할 수 있다.


#ifdef UNICODE

typedef WCHAR TCHAR, *PTCHAR, PTSTR;

typedef CONST WCHAR *PCTSTR;

#define __TEXT(quote) quote // r_winnt


#else

typedef CHAR TCHAR, *PTCHAR, PTSTR;...


#endif


1. 문자 인코딩

윈도우의 운영체제의 다국어 지원 기능을 통해 다국어 버전을 빨리 개발하여 출시 할 수 있다. 

윈도우의 보안이 강화된 C 런타임 라이브러리 제공 함수들을 다루는데, 이를 활용하여 버퍼 오버런을 미연에 방지할 수 있다.


유니코드 기반의 문자를 사용하여 애플리케이션의 수행성능과 지역화를 쉽게 하고, COM 과 닷넷 프레임워크와의 상호운용도 손쉽게 해보자.


01. 문자인코딩


지역화의 문제 원인 : 다양한 문자 집합 고려에 그 뿌리를 둔다.

초창기 개발자들은 0으로 끝나는 1바이트 문자의 집합으로 문자열을 생각하고 개발해 왔는데, 256가지로는 표현할 수 없는 문자들이 등장.

> DBCS (double-bytes character set) 의 등장. ( 1바이트 / 2바이트 )

- 첫번째 문자가 어느 값 범위내에 있으면 하나의 문자를 결정하기 위해 다음 바이트를 확인해야함


이를 사용하는 것은 문자 길이 계산등과 같은 함수 구현만 생각해도 끔찍한 일..


> 유니코드의 등장

윈도우는 UTF-16 을 사용하여 인코딩한다. (UTF : Unicode Transformation Format)

각 문자를 2바이트로 구성.

전세계 대부분의 언어가 16비트로 표현이 가능하기 때문. 몇몇 언어는 32비트라야 표현이 가능한데, 공간 절약과 편의성의 절충안으로 16비트가 선택된 것..

- 윈도우 어플리케이션이 네이티브코드와 매니지드 코드 사이 문자열 전달이 필요하다면 UTF-16이 좋은 선택.


UTF-8 

하나의 문자를 나타내기 위해 1 ~ 4 바이트로 인코딩한다. 0x0080 이하의 문자라면 1바이트로 인코딩. (영어에 잇어 최상의 방법)

0x0080 ~ 0x07FF 라면 2바이트. (유럽, 중동 언어 포함), 0x0800 이상이라면 3바이트. (동아시아 언어) 

0x0800 문자를 많이 사용할 경우 비효율적. 


UTF-32

모든 문자를 4바이트로 인코딩한다. 모든 언어에 대해 문자 변환 알고리즘을 간단히 구성하려 할때나 가변길이 인코딩 방식을 사용하지 않을 때 유용.