본문 바로가기

프로그래밍 -----------------------/C,C++ 팁

2바이트케릭터 <-> 1바이트케릭터 문자열 변환


http://blog.daum.net/crexy/6893583 에서 불펌.. -_-ㅋ;;

------------------------------------------------------------------------------------------

 

 

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 에 상관없이 해당 코드 환경에 알맞게 문자열을 변환해준다.