블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

GDI+를 사용하게 되면 문자는 기본적으로 유니코드를 사용하게되어 있다.

그렇기 때문에 ANSI코드를 직접 입력하게 되면 문자가 깨져나오는 불상사가 생기게 된다.

그렇기때문에 #define UNICODE 메크로를 사용하여 코드가 유니코드를 사용하게 해야하는데 이는 아직 익숙치 않은 것이라 ANSI를 UNICODE로 변환하여 사용하는 방법을 사용한다. 물론 익숙하지 안은 것이외에도 반드시 코드변환을 사용해야 할 경우는 있다.

텍스트 파일에 있는 문자를 읽어 올 때에는 아직까지 모든 텍스트 파일의 문자는 ANSI로 되어 있기 때문에 이를 UNICODE로 변환 해야하는 경우가 있을 수 있다.

 

ANSI 코드를 UNICODE로 변경시켜주는 API 함수는 MultiByteToWideChar()이 있다

MultiByteToWideChar

(

UINT CodePage,               //변환대상의 코드페이지

DWORD dwFlag,               //변환 Flag

LPCSTR lpMultiByteStr,      //변환대상 MBCS 문자열

int cbMultiByte,                //변환대상 문자열 길이 -1이면 자동으로 길이 계산

LPWSTR lpWideCharStr,      //변환결과를 저장할 버퍼

int cchWideChar                //변환결과 문자열 길이 보통 변환대상의 2배로 설정한다.

)

 

UNICODE 를 ANSI로 변환할때는 WideCharToMultiByte()를 사용한다.

MultiByteToWideChar

(

UINT CodePage,                  //변환대상의 코드페이지

DWORD dwFlag,                  //변환 Flag

LPCWSTR lpWideCharStr,      //변환대상 MBCS 문자열

int cchWideChar,                 //변환대상 문자열 길이 -1이면 자동으로 길이 계산

LPSTR lpMultiByteStr,           //변환결과를 저장할 버퍼

int cbMultiByte,                   //변환결과 문자열 길이

LPCSTR lpDefaultChar,         //변환할 수 없는 문자를 대신할 문자

LPBOOL lpUsedDefaultChar   //기본으로 설정된 lpDefaultChar여부를 확인

)

 

char *amsg = "Good programming!";

wchar_t wstr[100];

 

wchar_t *wmsg = L"Perpect programming!";

char astr[100];

 

MultiByteToWideChar(CP_ACP, 0, amsg, -1, wstr, 100);

 

WideCharToMultiByte(CP_ACP, 0, wmsg, -1, astr, 100, NULL, NULL); 

 

 

위와 같이 MultiByteToWideChar 와 WideCharToMultiByte 를 사용해서 코드를 변환 할 수 있지만 문자열이 간단한 것이라면 다음과 같이 wsprintfW 와 wsprintfA를 사용해 더욱 간단하게 코드 변환을 할 수 있다.

char *amsg = "Good programming!";

wchar_t wstr[100];

 

wchar_t *wmsg = L"Perpect programming!";

char astr[100];

 

wsprintfW(wstr, L"%S", amsg);

 

wsprintfA(astr, "%S", wmsg);

 

%S에서 s가 대문자인 것을 유의해야한다. 

 

 

API는 ANSI 와 UNICODE의 혼합 사용을 지원하기 위해 매크로를 지원하고 있다. 실제로는 무척 많은 양이지만 압축하면 다음과 같다.

일반형 UNICODE ANSI Description
TCHAR wchar_t char 문자
LPTSTR wchar_t* char* 문자열
LPCTSTR const wchar_t* const char* 문자열 상수

 

TEXT("문자열")을 사용하면 ANSI, UNICODE 에 상관없이 해당 코드 환경에 알맞게 문자열을 변환해준다.

 

출처 : http://blog.daum.net/crexy/7265111


반응형
Posted by blueasa
, |