본문 바로가기

Programming/Win32&MFC&COM

MFC, API 프로그래밍에서 유니코드 처리하기

반응형

요즘은 거의 대부분 유니코드를 적용해서 프로젝트를 진행할 것으로 보입니다.

멀티바이트 문자열을 받는 대부분의 Win32 API 함수들은 유니코드로 바꿔서 다시 유니코드 함수를 호출해줍니다.

그러니 바로 유니코드 형식을 사용하는 편이 더 효율적이라고 할 수 있습니다.

일반적으로 API 함수가 오류가 나면 함수명에 A나 W가 붙죠.

MessageBox라는 메시지 박스를 띄우는 게 오류시 MessageBoxA / MessageBoxW로 표기가 됩니다.

여기서 A냐 W냐가 멀티바이트 코드 함수, 유니코드 함수로 구분이 됩니다.

멀티바이트 코드인가 유니코드 프로젝트인가를 확인해서 해당하는 API를 호출하는 것은 #define 전처리기를 통해 가능합니다.

#define UNICODE로 정의되어 있으면 자동으로 유니코드 함수를 호출하도록 되어 있습니다.

만약 정의되어 있지 않으면 멀티바이트 코드 함수를 호출하고 문자열을 유니코드로 바꿔서 호출하게 되는 것입니다.

MessageBox의 정의를 따라가다 보면 WINUSER.H 파일에 다음과 같은 정의가 등장합니다.

WINUSERAPI
int
WINAPI
MessageBoxA(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCSTR lpText,
    _In_opt_ LPCSTR lpCaption,
    _In_ UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

이런 식으로 #define UNICODE에 따라서 호출하는 함수가 달라지는 것입니다.

그리고 _T(혹은 TEXT)라는 매크로가 존재합니다.

유니코드일 때 문자열 앞에 L이 붙기 때문에 _T는 유니코드일 때 L로 치환되고, 멀티바이트일 때는 사라집니다.

이런 식으로 작성하게 되면 프로젝트의 문자 속성에 종속되지 않게 개발이 가능합니다.

그리고 char와 wchar_t를 상호 변환 해주는 TCHAR는 매크로도 준비가 되어 있습니다.

C 문자열 라이브러리의 strlen(wcslen), strcpy(wcscpy) 등도 매크로가 등록이 되어 있습니다.

_tcslen, _tcscpy 등이 정의되어 있기 때문에 사용하면 됩니다.

간단하게 멀티바이트 <-> 유니코드 간 변환을 위한 매크로도 존재합니다.

A2W나 W2A등의 매크로입니다.

이름에서 보이듯이 Ansi To WideChar, WideChar To Ansi 입니다.

CA2W나 CW2CA 등으로 A나 W앞에는 C를 붙여서 const라는 것을 나타낼 수도 있습니다.

또한 T2A나 T2W 등의 매크로도 있습니다.

이런 매크로 함수를 사용하기 위해서는 아래 코드를 추가한 이후에 사용해야 합니다.

USES_CONVERSION;

사용 전에 한 번만 선언하면 되며 메모리를 스택에 동적할당 하는 코드이기 때문에 주의해서 사용해야 합니다.

되도록이면 유니코드 기반으로 작업하는 습관을 들이는 것을 더 추천합니다.

반응형