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


 

저작자 표시 비영리 변경 금지
1 2 3 4 5 ... 34


티스토리 툴바