Data Analysis for Investment & Control
[Tip] LPCWSTR(유니코드) <-> LPCSTR(멀티바이트) 쉽게 변환하기 본문
C++/MFC 코딩을 할 때 Visual Studio의 프로젝트 환경은 유니코드로 놓고 사용하는 편이다. 왜냐하면 다국어 지원이 가능하기 때문. 머 그렇다고 다양한 국가의 언어를 사용하는 국제적인 프로그램을 만들었던 것은 아니지만...
가끔 다른 사람들이 만들어 놓은 코드나 dll을 사용해야 할 경우가 있다. 그럴 때 멀티바이트 기반으로 작성해 놓은 것을 내 코드에 적용시키기 위해 일일히 변환시켜 줘야해서 짜증날 때가 많다. 그렇다고 변환이 쉽냐면 그것도 아닌데, 해결 방법을 Googling을 해도 쉽게 찾을 수는 없었다.
그러다가 누군가 그나마 쉽게 할 수 있는 방법을 올려놓은 것을 발견했는데, 꼬박 하루 내내 고민하면서 변수 선언과 이런 저런 함수를 연달아서 사용해도 되지 않아서 참으로 간편하다.
예제 코드는 다음과 같다..
#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와 함께 헤더를 찾아보면 쉽게 알 수도 있었다)를 이용하는 방법을 발견했다.
사용법은 거의 같으나 파라미터 인자가 하나 더 붙는데, 인코딩 모드를 선택하는 것이다. 샘플 코드는 다음과 같다.
#include <Windows.h>
#include <atlbase.h>
#include <iostream>
void func()
{
USES_CONVERSION; // 매크로 선언
LPCSTR mChar;
LPCWSTR wChar = L"test";
'Code > C++:C#:MFC' 카테고리의 다른 글
[C++/STL] 디렉토리 내 파일 리스트 얻어오는 함수 (0) | 2016.01.13 |
---|---|
[Tip] DLL에서 다이얼로그 사용 시, 다이얼로그 창이 뜨지 않는 문제 (0) | 2015.05.18 |
C++ dll의 CLR 프로젝트(C++/CLI)의 사용(3) (0) | 2014.04.20 |
C++ dll의 CLR 프로젝트(C++/CLI)의 사용(2) (0) | 2014.04.18 |
C++ dll의 CLR 프로젝트(C++/CLI)의 사용(1) (0) | 2014.04.17 |