유니코드는 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비트의 안시 문자가 된다.