상세 컨텐츠

본문 제목

02. 아스키코드 vs 유니코드

Programming/Windows System

by RACC8N 2020. 3. 17. 22:29

본문

ASCII(American Standard Code for Information Interchange) CODE :

미국에서 정의하고 있는 표준이다. 알파벳 + 몇몇 확장 문자를 포함해도 256을 넘지 않는다. 따라서 1byte로 표현이 이 된다.

 

UNICODE : 

전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 잇도록 설계된 산업 표준이다. ASCII CODE로는 영어를 제외한 다른 언어를 표현할 수 없으므로 등장하였다. 유니코드는 문자를 표현하는 데 있어서 균일하게 2byte를 사용한다.

 

문자셋 (Character Set) : 

문자들의 집합, 즉 "약속된 문자의 표현방법"을 의미한다. 문자셋은 종류에 따라서 세 가지 형태로 나뉘어진다.

 

1. SBCS (Single Byte Character Set) :

문자를 표현하는 데 있어서 1byte만 사용하는 방식이다. ASCII CODE가 속한다.

 

2. MBCS (Multi Byte Character Set) :

문자를 표현하는 데 있어서 1byte와 2byte를 사용하는 방식이다. (MBCS는 SBCS를 포함한다.) -> ASCII CODE에서 정의하고 있는 문자를 표현 할 때는 1byte로, 그 외의 문자들은 2byte로 표현한다. (따라서 UNICODE는 MBCS에 속하지 않는다.)

효율적으로 문자를 표현하지만, 구현하는데 주의가 필요하다.

ex) char str[] = "Abc한글";  일 경우 실제 길이는 5이지만, strlen(str) = 7이다. "한글"이라는 단어는 길이가 4로 인식되기 때문이다.

 

3. WBCS (Wide Byte Character Set) :

문자를 표현하는 데 있어서 2byte만 사용하는 방식이다. UNICODE가 속한다.

 

#include<windows.h>

windows.h는 windows 기반 프로그래밍을 하는데 있어서 기본적으로 포함해야하는 파일이다.

 

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

 typedef char CHAR
typedef wchar_t WCHAR
     
typedef CHAR * LPSTR
typedef CONST CHAR * LPCSTR
typedef WCHAR * LPWSTR
typedef CONST WCHAR * LPCWSTR

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

다음은 헤더파일 tchar.h에 선언되어 있는 일부 내용이다. tchar.h는 windows.h에 포함되지 않기때문에 따로 선언해줘야한다. 

#ifdef  __UNICODE
	#define  __T(x)  L ## x
#else
	#define  __T(x)  x
#endif


#define  _T(x)		__T(x)
#define  _TEXT(x)	__T(x)

 

매크로 UNICODE가 정의되면
TCHAR array[10]; WCHAR array[10]; wchar_t array[10];
매크로 UNICODE가 정의되지 않으면
TCHAR array[10]; CHAR array[10]; char array[10];
매크로 _UNICODE가 정의되면
_T("HANBIT"); __T("HANBIT"); L"HANBIT"
매크로 _UNICODE가 정의되지 않으면
_T("HANBIT"); __T("HANBIT"); "HANBIT"

2. MBCS와 WBCS를 동시에 지원하기 위한 함수들

#ifdef	_UNICODE
	#define	_tmain	wmain
    	#define	_tcslen	wcslen
    	#define	_tcscat	wcscat
    	#define	_tcscpy	wcscpy
    	#define	_tcsncpy	wcsncpy
    	#define	_tcscmp	wcscmp
    	#define	_tcsncmp	wcsncmp
    	#define	_tprintf	wprintf
    	#define	_tscanf	wscanf
    	#define	_fgetts	fgetws
    	#define	_fputts	fputws
#else
	#define	_tmain	main
    	#define	_tcslen	strlen
    	#define	_tcscat	strcat
    	#define	_tcscpy	strcpy
    	#define	_tcsncpy	strncpy
    	#define	_tcscmp	strcmp
    	#define	_tcsncmp	strncmp
    	#define	_tprintf	printf
    	#define	_tscanf	scanf
    	#define	_fgetts	fgets
    	#define	_fputts	fputs
#endif

이것만은 알고 갑시다

 

1. SBCS, MBCS, WBCS의 이해 

SBCS는 문자를 표현하는 데 1바이트를 MBCS는 1바이트 혹은 2바이트를, WBCS는 2바이트를 사용하는 문자셋이다.

 

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

ANSI 표준 문자열 처리 함수는 별도로 유니코드 기반을 정의하고 있다. 이들을 사용해서 유니코드 기반으로 프로그램을 작성할 수 있어야 한다.

 

3. UNICODE와 _UNICODE

매크로 UNICODE와 _UNICODE의 정의 유무에 따라서 함수의 선언형태가 달라진다. 이 두 매크로를 기반으로 유니코드 방식과 MBCS 방식의 컴파일이 가능하도록 프로그램을 작성할 수 있어야 한다.

 

4. 유니코드 방식과 MBCS 방식을 모두 지원하기 위한 main 함수의 구성

MBCS 방식에선 main을, 유니코드 방식에선 wmain을 쓴다. 매크로 _UNICODE를 선언하고  _tmain을 사용하면 된다.

 

관련글 더보기

댓글 영역