Data Analysis for Investment & Control

[Tip] LPCWSTR(유니코드) <-> LPCSTR(멀티바이트) 쉽게 변환하기 본문

Code/C++:C#:MFC

[Tip] LPCWSTR(유니코드) <-> LPCSTR(멀티바이트) 쉽게 변환하기

아슈람 2015. 5. 18. 00:48
반응형

 

 

C++/MFC 코딩을 할 때 Visual Studio의 프로젝트 환경은 유니코드로 놓고 사용하는 편이다. 왜냐하면 다국어 지원이 가능하기 때문. 머 그렇다고 다양한 국가의 언어를 사용하는 국제적인 프로그램을 만들었던 것은 아니지만...

 

가끔 다른 사람들이 만들어 놓은 코드나 dll을 사용해야 할 경우가 있다. 그럴 때 멀티바이트 기반으로 작성해 놓은 것을 내 코드에 적용시키기 위해 일일히 변환시켜 줘야해서 짜증날 때가 많다. 그렇다고 변환이 쉽냐면 그것도 아닌데, 해결 방법을 Googling을 해도 쉽게 찾을 수는 없었다.

 

그러다가 누군가 그나마 쉽게 할 수 있는 방법을 올려놓은 것을 발견했는데, 꼬박 하루 내내 고민하면서 변수 선언과 이런 저런 함수를 연달아서 사용해도 되지 않아서 참으로 간편하다.

 

예제 코드는 다음과 같다..

 

 

#pragma once
#include <Windows.h>
#include <atlbase.h>
#include <iostream>

 

void func()

{ 

    USES_CONVERSION; // 매크로 선언


    LPCSTR mChar;

    LPCWSTR wChar = L"test";

 

    mChar = W2A(wChar); // 유니코드 문자열을 멀티바이트 문자열로 변환
    wChar= W2A(mChar); // 멀티바이트 문자열을 유니코드 문자열로 변환

}

 

 

필요한 헤더파일을 include 해주고, 변환이 필요한 함수 내에서 매크로를 선언한 후에, W2A 혹은 A2W 함수로 변환해주면 끝이다!!!

 

아마도 W2A나 A2W 함수 내에서 문자열 변환에 필요한 메모리 할당은 할 텐데, 매크로가 선언된 함수를 벗어나면 할당된 메모리가 자동으로 반환되게 끔 해 놓은 모양이다. 다른 건 몰라도 메모리 관리까지 알아서 해준다는 점은 정말 마음에 든다.

 

 

<내용 추가>

 

MySQL을 이용하여 문자열 데이터를 얻어오는 과정에서 CharSet Encoding 문제로 이틀 정도 고생을 했는데, 처음에는 A2W를 사용하여 wstring으로 받으려고 했으나 Encoding이 제대로 되지 않아 깨져서 저장되었다.


그러던 중 우연히 A2W_CP 매크로(사실 A2W와 함께 헤더를 찾아보면 쉽게 알 수도 있었다)를 이용하는 방법을 발견했다.

 

사용법은 거의 같으나 파라미터 인자가 하나 더 붙는데, 인코딩 모드를 선택하는 것이다. 샘플 코드는 다음과 같다.


 

#pragma once
#include <Windows.h>
#include <atlbase.h>
#include <iostream>

 

void func()

    USES_CONVERSION; // 매크로 선언


    LPCSTR mChar;

    LPCWSTR wChar = L"test";


    wChar= A2W_CP(mChar, CP_UTF8); // 멀티바이트 문자열을 UTF-8 인코딩하여 유니코드 문자열로 변환

}

 

 

반응형
Comments