행복한 연어의 이야기

(윈도우 시스템) 2. 아스키코드 vs 유니코드 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 2. 아스키코드 vs 유니코드

해피살몬 2021. 7. 21. 20:34

1. Windows 에서의 유니코드(UNICODE)

문자셋의 종류와 특성

 

SBCS(Single Byte Character Set)

Single Byte 즉 문자를 표현하는데 1Byte를 사용하는 문자

아스키코드가 여기에 속한다.

 

MBCS(Multi Byte Character Set)

Multi Byte 어떤 문자는 1Byte 어떤 문자는 2Byte 를 사용한다.

MBCS는 SBCS 를 포함하는 개념이며 아스키 코드가 표현할 수 있는 문자열일 경우 SBCS 

그 외의 문자의 경우 MBCS 에 속한다.

 

WBCS(Wide Byte Character Set)

Wide Byte 모든 문자를 2Byte로 표현한다.

유니코드가 여기에 속한다.

 

MBCS 기반의 문자열

현재 우리가 사용하는 운영체제의 기본 방식은 MBCS 이다.

MBCS 는 1바이트 문자(영어)와 2바이트 문자(한글)을 혼용하기 때문에

 문자열의 길이와 바이트의 길이가 맞지 않는다거나 등 문제가 발생할 수 있다.

이를 해결하기 위해서 모든 문자열을 2바이트로 처리하는 WBCS 이 해결책이 될수 있다. 

 

WBCS 기반의 프로그래밍

WBCS 기반(유니코드)으로 프로그래밍 하기위해서는 몇가지 주의점이 있다.

char 대신 wchar_t 사용하기

char 는 1byte 를 할당하지만 wchar_t 는 2byte를 할당한다.

"ABC" 대신 L"ABC"

사용하는 문자열 앞에 L 을 붙여 유니코드기반 문자열로 바꿔준다.

"ABC" 는 MBCS 기반 문자열이고 L을 붙이면 WBCS 기반으로 바뀐다.

문자열 조작 함수  

기존에 사용하던 문자열 함수들은 SBCS 기반으로 작동한다.

문자열 조작 함수들도 WBCS 기반 함수들을 사용해야한다.

strlen -> wcslen, printf -> wprintf 등 (매개변수도 WBCS 기반 문자열이어야 한다.)

메인 함수

메인 함수또한 main 에서 wmain 으로 바꿔주어야한다.

그래야 프로그래심 시작시 전달되는 문자열이 WBCS 기반으로 들어오게 된다.

 

2. MBCS 와 WBCS 동시 지원

위 방법대로 문자열을 쓸때마다 다 바꿔서 작성하는 것은 쉬운일이 아니다.

또한 모든 시스템이 WBCS 기반을 지원하는 것이 아니기 때문에 무턱대고 WBCS만을 고집하면

문제가 발생할 확률이 높다.

그러니 MBCS 와 WBCS 를 동시 지원하는 방법에 대해서 알아보자

 

Windows 에서 정의하고 있는 자료형

windows.h 를 살펴보면 typedef 를 통해서 정의하고 있는 자료형이 있다.

간단하게 몇가지만 살펴보자

typedef	char	CHAR
typedef	wchar_t	WCHAR
typedef	CHAR *	LPSTR
typedef	WCHAR *	LPWSTR

 

MBCS와 WBCS 를 동시에 지원하기 위한 매크로

이 또한 Windows 에서 정의되어 있는 부분 중에 하나이다.

#ifdef UNICODE
	typedef	WCHAR	TCHAR
    	typedef	LPWSTR	LPTSTR
#else
	typedef CHAR	TCHAR
   	typedef	LPSTR	LPTSTR

 

이제 TCHAR 을 사용한다면

#define UNICODE

유무에 따라 MBCS 와 WBCS 가 바뀌는 것을 확인할 수 있다.

또한 관련 함수 또한 매크로 정의를 해주어야 하는데

함수는 windows.h 가 아닌 tchar.h 안에 있으며

#define _UNICODE

로 정의를 해주어야 한다.

#define 선언은 관련 헤더파일을 불러오기 전에 정의를 해주어야 작동한다.

간단하게 정리 하자면

mian() = MBCS

wmain() = WBCS

_tmain() = #define 유무에 따른 MBCS, WBCS 사용

 

알고 넘어가야할 것

1. SBCS, MBCS, WBCS 의 이해

2. 유니코드 기반 문자열 처리 함수들

3. UNICODE 와 _UNICODE

4. MBCS 방식과 WBCS 방식을 모두 지원하기 위한 main 함수 구성방법

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

 

 

Comments