본문 바로가기

프로그래밍

문자 집합 MBCS & UNICODE

반응형

■ 멀티바이트 문자집합(MBCS)

 

한글이나 한자의 경우 

문자의 개수가 매우 많아서 영어처럼 1바이트에 한 글자를 저장할 수 없다.

 

그래서 이러한 동양의 문자를 저장하기 위해서

멀티바이트 문자 집합(MBCS)이라는 개념이 나왔다.

 

MBCS는 한글자를 저장하기 위해 2바이트 이상을 사용할 수 있게 해준다.  

 

 

예를 들어

다음과 같이 선언하고 문자열을 저장하면 

 

한글은 2바이트에 , 

영문자와 특수문자는 1바이트에

저장된다.

 

char str[15] = "나는 love";

[][][][][][l][o][v][e][\0][][][][][]

 

그런데 이때 실제 글자의 개수와 공간의 크기가 일치하지 않는 문제가 발생한다.

따라서 문자열에서 몇 번째 글자가 무엇인지 알기 위해서 

한글이 몇 자이고 그 외 문자가 몇 자인지 알고 있어야 한다.

 

예를 들어 위 문자열에서 뒤의 네 자 'love'를 삭제하려면

각 바이트에 한글이 저장되어 있는지 영어가 저장되어 있는지 알아야 한다.

멀티바이트 문자 집합은 낭비되는 공간이 없기 때문에 

메모리 사용측면에서 매우 효율적이며 

주로 영어로 된 문자열을 처리할 때 불필요하게 공간을 낭비하지 않는다.

 

 

 

■ 유니코드 문자집합(UNICODE)

 

한글을 저장하는 데 유니코드를 이용할 수도있다.

유니코드에서는 영어나 한글 구분없이 모든 문자를 2바이트에 저장한다. 

즉 한글은 2바이트를 모두 사용하며, 영문자나 특수문자는 1바이트만 사용하고

나머지 공간은 사용하지 않는 방식이다. 

 

이렇게 하면 멀티바이트에서 발생하는 단점을 피할 수 있다. 

문자열에서 몇 번째 글자를 얻어내기 위해 위치에 2를 곱하면 되기 때문이다. 

 

위와 마찬가지로 문자열에서 뒤의 네 자만 삭제하기 위해 문자열 전체 공간 중 뒤에서 8바이트 앞에 NULL 문자를 넣으면 된다. 

하지만 영어가 많이 사용되는 프로그램에서는 메모리의 낭비가 많아진다는 단점이 있다.

 

C언어 프로그램에서 WCHAR라는 자료형을 제공하는데 

이는 유니코드 문자열을 위한 자료형이다. 

 

따라서 문자열을 유니코드로 저장하려면 기존의 char가 아닌 WCHAR를 사용해야 한다.

 

다음과 같이 선언했다고 가정해보자.

 

WCHAR str[15] = L "나는 love";

[][][][][][\0][l][\0][o][\0][v][\0][e][\0][\0]

 

여기서 문자열 상수 앞에 L을 넣은 것은 유니코드로 변환하기 위함이다. 

기본 문자열 상수는 모두 멀티바이트이기 때문이다. 

한글을 저장하는 것은 멀티바이트의 경우와 동일하며, 

영문자나 특수문자에도 2바이트를 제공해서 앞쪽에 문자를 저장하고 

뒤쪽에는 NULL문자를 저장한다.

 

단 프로그램을 작성할 때 어떤 문자집합을 사용할 지 미리 결정해야 한다.

중간에 바꾸면 코드를 수정해야 하는데 이를 해결하기 위해서 TCHAR를 제공하고 있다.

 

TCHAR는 두 문자 집합의 중간 형태로 프로젝트 속성에서 설정된 문자 집합에 따라서

문자열을 처리하는 부분을 멀티바이트 또는 유니코드로 자동 변경해준다. 

 

따라서 앞의 예는 다음과 같이 선언 할 수 있다.

 

TCHAR str[15] = _T("나는 love");

 

이와 같이 작성된 코드는 프로젝트 속성의 문자 집합 설정 값에 따라 자동으로 변경된다.

 

TCHAR를 이용하기 위해서는 헤더 파일을 포함시켜야한다.

 

#include <TCHAR.h> 

 

 

 

 

 

< 문자열을 가리키는 포인터 형 변수 종류 >

 

 

 API자료형  같은의미의자료형 설명
 LPSTR char *    ANSI 코드 문자열에 대한 포인터 형 
 LPCSTR Const char *  ANSI 코드 문자열에 대한 포인터 상수형 
 LPTSTR TCHAR *   TCHAR 코드 문자열에 대한 포인터형
 LPCTSTR Const TCHAR *  TCHAR 코드 문자열에 대한 포인터상수형
 LPWSTR WCHAR *   유니코드 문자열에 대한 포인터 형
 LPCWSTR Const WCHAR *    유니코드 문자열에 대한 포인터 상수형

 

 

LP = Long Pointer 

C = Const

STR = 문자열

W = WCHAR (유니코드 문자열에 대한 포인터형)

T = TCHAR (유니코드 & 멀티바이트 지원

 

참고

T가 붙은 자료형에 문자열을 저장할 때는 매크로 _T()를 이용한다.

 

 

 

 

 

<요약>

멀티바이트(WCHAR) -  한글은 2byte , 영문자&특수문자는 1byte로 저장된다.

유니코드(TCHAR)     - 무조건 2byte로 저장되며 빈공간은 NULL로 채운다.

 

 

 

참고서적 : 핵심 API로 배우는 윈도우 프로그래밍

반응형