Programming Tips

프로그램 개발 시 주로 사용하는 Visual Studio 에서는 프로젝트 속성 메뉴에 '문자 집합' 이란 항목이 있다.

(본 포스트에서는 2010 한글판을 사용 하였습니다.)  

 

 

문자 집합 항목에서 사용할 수 있는 옵션은 크게 세가지 '설정 안함(Not Set)', '멀티바이트 문자 집합 사용(Use Multi-Byte Character Set)', '유니코드 문자 집합 사용(Use Unicode Character Set)'이 있다.

 

 

위의 세가지 옵션의 차이를 설명하기 전 컴퓨터에서는 데이터를 처리하기 위해 2진법을 쓴다. 즉 컴퓨터에서는 숫자를 처리할 수는 있지만 문자는 기본적으로 처리가 불가능 하다. 그래서 문자를 처리하기 위해 문자 집합(Character Set) 이라는 것을 사용한다.

 

대표적으로 대부분의 사람들이 잘 알고 있는 아스키 코드(ASCII Code[각주:1])가 그 예이다. 아스키 코드는 이름 그대로 미국 표준 문자 집합이기 때문에 해당 문자 집합에는 전 세계 언어를 표현하기 위한 약속이 되어 있지 않다. 그리하여 만들어진 문자 집합이 바로 유니코드(UNICODE)이다. 유니코드는 전 세계 모든 문자를 컴퓨터에서 일관되게 표현하고 처리하기 위한 국제 표준 이다.

 

이 두 문자 집합을 비교해 보자면 아스키 코드는 문자 하나를 표현하기 위해 메모리 1byte를 필요로 하고 유니코드는 문자 하나를 표현하기 위해 최소 2byte를 필요로 한다.

 

위와 같은 문자 집합들을 크게 세가지로 분류 하는데 그 세가지는 다음과 같다.

 

SBCS(Single Byte Character Set) : 문자 하나를 표현 하는데 있어 1바이트를 사용하는 방식이다.

MBCS(Multi Byte Character Set) : 문자 하나를 표현 하는데 있어 다양한 바이트 수를 사용하는 방식이다.

WBCS(Wide Byte Character Set) : 문자 하나를 표현 하는데 있어 2바이트를 사용하는 방식이다.

 

SBCS의 대표적인 문자 집합은 아스키코드, WBCS의 대표적인 문자 집합은 유니코드라 할 수 있고

MBCS는 아스키코드와 유니코드를 혼용하여 사용할 수 있는 방식이라 할 수 있겠다.

 

본론으로 돌아가 Visual Studio의 문자 집합 설정 세 가지의 차이점을 확인 해보자면 프로젝트 생성 시 정의되는 기본 매크로의 차이가 있다.(프로젝트 속성 -> C/C++ -> 전처리기 -> 전처리기 정의 -> 편집)

 

 

 

 

 

 

 

 

 

 

위 전처리기 정의의 결과를 보면 '설정 안함'으로 선택 시 프로젝트 기본 매크로 설정에 추가 되는 값은 없으며 '유니코드 문자 집합' 사용 시 '_UNICODE' 와 'UNICODE','멀티바이트 문자 집합' 사용 시 '_MBCS' 값이 추가 됨을 확인할 수 있다.

 

결과적으로 문자 집합에 의한 차이는 전처리 과정에서 매크로 값의 차이로 인하여 헤더에 선택되는 자료형 및 함수가 달라 진다는 점이다.

 

문자 집합 선택에 따른 'tchar.h' 헤더파일의 차이를 확인해 본다.

 

'설정 안함' 선택 시 유니코드 영역의 코드는 주석처리가 됨을 확인할 수 있고

 

 

 SBCS and MBCS 영역과 SBCS 영역은 활성 화 되어 있음을 확인할 수 있고 

 

 

 

마지막으로 MBCS 영역 또한 주석처리 되어 있음을 확인할 수 있다.

 

 

정리 해보자면

 

선택 안함                -> SBCS : 활성화,    SBCS and MBCS : 활성화,    MBCS : 주석처리, UNICODE : 주석처리

유니코드 문자 집합   -> SBCS : 주석처리, SBCS and MBCS : 주석처리, MBCS : 주석처리, UNICODE : 활성화

멀티바이트 문자 집합 ->SBCS : 주석처리, SBCS and MBCS : 활성화,    MBCS : 활성화,    UNICODE : 주석처리

 

위와 같은 상태가 된다.

 

SBCS, MBCS 영역의 코드를 살펴 보면 char 계열의 자료형과 관련 함수가 선택 되고 UNICODE 선택 시에는 wchar_t 계열의 자료형과 관련 함수가 선택됨을 확인할 수 있다.

 

마지막으로 정리 보자면 윈도우즈 프로그래밍 시 ANSI 기반의 함수를 사용한다면 '설정 안함' 또는 '멀티바이트 문자 집합'을 사용하고 UNICODE 기반의 함수를 사용한다면 '유니코드 문자 집합'을 사용하면 되겠다.

 

 

  1. American Standard Code for Information Interchange [본문으로]

+ Recent posts