JHB의 프로그래밍 삽질기

유니코드 프로그래밍 본문

PROGRAMMING/Win/MFC

유니코드 프로그래밍

roter 2009.02.13 18:12

변수 명명법

 

 cb  Count of Bytes  바이트 수
 dw  double word long형 정수
 h  handle  핸들
 sz  Null Terminated NULL  종료 문자열
 ch  Character  문자형
 a  Array  배열
 w  Word  부호없는 정수형
 i  integer  정수형
 p,lp  long pointer  포인터형
 b Bool  논리형


핸들이란?

정수값 대부분의 경우 32비트값.

운영체제가 발급하며 사용자는 쓰기만 한다.

같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.

정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다.


유니코드 16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계.

C언어의 타입을 바로 쓰지 말고 유니코드 설정에 따라 변경되는 중간 타입을 사용.

 C타입 유니코드 타입
 char  TCHAR
 char*  LPSTR
 const char*  LPCTSTR

유니코드로 컴파일 할때는 wchar_t 타입이 된다. 실제로 unsigned short로 정의 . 부호없는 16비트 정수형.

TCHAR 타입의 실제 정의문


#ifdef UNICODE

typedef wchar_t TCHAR;
#else

typedef char TCHAR;

#endif


 C 표준함수 유니코드 지원함수
 strlen  lstrlen
 strcpy  lstrcpy
 strcat  lstrcat
 strcmp  lstrcmp
 sprintf  wsprintf

TCHAR* str="string";

TCHAR* str=TEXT("string");  // 이렇게 쓰는게 좋다. 유니코드 설정에 따라 문자열 상수의 타입 변경


 

_PTR이 붙은 타입은 운영제체의 비트수에 따라 크기가 가변적이며 포인터와 같은 길이를 가짐. 포인터와 호환되어야 하는 정수 필요시는 이 타입을 사용 int대신 INT_PTR.






원문보기: http://www.itka.kr/zbxe/?mid=debugprog&page=1&document_srl=1051

유니코드는 16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다. 유니코드의 등장 배경과 내부적인 구성 원리 등의 자세한 사항에 대해서는 다음에 따로 상세하게 다루되 여기서는 준비만 해 두자. 유니 코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고 유니코드 설정에 따라 변경되는 중간 타입을 사용한다. C언어에 익숙한 사람들은 앞으로 문자나 문자열을 표현할 때 다음 타읍들을 쓰도록하자

 

C 타입

유니코드 타입

char

TCHAR

char

LPSTR

const char*

LPCTSTR

TCHAR C의 기본 타입 중 하나인 char와 일단 같지만 유니코드로 컴파일할 때는 wchar_t타입이 된다. Wchar_t는 실제로는 unsigned short 로 정의 되어 있으며 부호없는 16비트 정수형이다. TCHAR타입의 실제 정의문은 다음과 같이 조건부 컴파일문으로 작성되어 있다.

 

#ifdef UNICODE

typedef wchar_t TCHAR;

#else

typedef char TCHAR;

#endif

char를 바로 쓴 소스는 유니코드로 바꿀 때 일일이 소스를 뜯어 고친 후 다시 컴파일해야 하지만 TCHAR라는 중간 타입을 사용한 소스는 프로젝트 설정에 따라 소스도 같이 바뀌는 효과가 있으므로 소스는 그대로 두고 컴파일만 다시 하면 된다. 문자열이 필요할 때도 char *를 쓰지 말고 가급적이면 LPSTR또는 TCHAR*를 쓰는 것이 현명하다.

 

C 표준 함수

유니코드 지원 함수

strlen

lstrlen

strcpy

lstrcpy

strcat

lstrcat

strcmp

lstrcmp

sprintf

wsprintf

Strlen char타입의 문자열 길이만 조사하지만 lstrlen TCHAR타입의 묹열에 대해서도 동작하므로 이식에 훨씬 더 유리하다. 문자열 상수도 타입이 있으므로 겹 따옴표안에 바로 문자열 상수를 쓰지 말고 TEXT 매크로로 둘러 싸는 것이 좋다.

TCHAR *str=”string”;       //이렇게 쓰지 말고

TCHAR *str=TEXT(“string”);          //TEXT 메크로 안에 문자열 상수를 쓴다.

TEXT 메크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경한다. 유니코등로 컴파일할 때는 각 문자가 16비트의 유니코드 문자가 되며 그렇지 않을 때는 8비트의 안시 문자가 된다.


http://cking4w.tistory.com/234 에서펌




char 형태 선언 할 때
유니코드는 WCHAR로 하며 WCHAR는 typedef wchar_t WCHAR; 이다.
멀티바이트는 그냥 char을 사용한다.
winnt.h에 정의되어있는 매크로에 의해
무조건 TCHAR로 하면 자동으로 유니코드/멀티바이트를 판단하여 컴파일 한다.
TCHAR로 하는게 안전~!
아, 참고로 TextOut을 쓸 때 strlen 안먹힌다고 징징거리지 말자.
유니코드에서는 lstrlen으로 해야한다.
0 Comments
댓글쓰기 폼