Java나 C#을 사용하다가 MFC를 사용하면서 느끼는 짜증나는 불편함이 있다면 문자열 처리에 대한 것이다.

Java나 C#에서의 문자열 처리의 개념으로 MFC에서 시도해보면 당황 스러울 정도로 답답함이 느껴진다.

본 포스트는 MFC에서의 문자열을 사용할수 있는 나름 편리한 도구인 CString을 이용한 코드조각을 소개하고자 한다.


같은 CString끼리는 + 연산으로 쉽게 두 문자열을 합칠수 있으므로 여기서는 CString 타입과 UINT 타입을 합쳐서

하나의 문자열로 만드는 경우를 다뤄보고자 한다.


현재 사용가능한 Serial Port를 출력한다고 가정할 경우 COM이라는 문자열과 1,2,3...과 같은 숫자를 하나의 문자열로 합친다면 다음과 같이 처리하면 된다.


#include <iostream>

using namespace std;


CString str = "COM";

CString port;

//UINT k = 3;

//str += k; //불가능


for (UINT i = 0; i < 7; i++)

{

                //CString과 UINT가 막바로 port = str + i와 같이 합쳐지지 않으므로 

                //UINT를 CString형으로 변환하는 작업

port.Format("%d", i);

port = str + port;


cout << "Available Serial Ports : " << port << endl;

printf("Ports : %s\n", port);

}


그런데 여기서 또 답답한 건 이 소스 코드의 문자 집합이 유니코드 집합을 사용할 경우는 컴파일 단계에서 아예 에러를 뿜는다.


CString str = "COM"; 이 코드에서는 『"const char [4]"에서 "ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, ATL::ChTraitsCRT<wchar_t>>>"(으)로 변환하기 위한 적절한 생성자가 없습니다라』는 에러를 뿜는다.


port.Format("%d", i); 이 코드에서는 

『인수 목록이 일치하는 오버로딩된 함수 ...의 인스턴스가 없습니다.

              인수 형식이(const char [3], UINT)입니다....』와 같은 에러가 발생한다.


이건 현재 Visual Studio에서 사용중인 문자 집합을 "멀티바이트 문자 집합 사용"으로 변경해 주어야 한다.

문자셋 인코딩 문제는 항상 모든 프로그래밍 언어들에서 신경쓰야 할 부분이지만 이건 정상적인 문법 자체가 잘못됐다고 에러를 내 보내니... 답답한 노릇이다.


문자 집합을 변경하는 방법은

해당 프로젝트 이름에 마우스 우측 클릭 ⇒ 팝업 메뉴에서 "속성" 클릭 ⇒ 해당 프로젝트의 속성 페이지 창에서 ⇒ 구성 속성의 하위 항목 중 "일반" ⇒ 우측 항목들 중 "문자 집합"의 드랍 다운 메뉴에서 "멀티바이트 문자 집합 사용"을 선택 ⇒ 확인




위의 코드를 실행하면 다음과 같을 결과를 내 보이게 될 것이다.


Available Serial Ports : COM0

Ports : COM0

Available Serial Ports : COM1

Ports : COM1

Available Serial Ports : COM2

Ports : COM2

Available Serial Ports : COM3

Ports : COM3

Available Serial Ports : COM4

Ports : COM4

Available Serial Ports : COM5

Ports : COM5

Available Serial Ports : COM6

Ports : COM6


+ Recent posts