01. Windows에서의 유니코드(UNICODE)
문자셋(Character Sets)의 종류와 특성
- 아스키코드(ASCII CODE)
- 1 바이트로 표현된다.
- 미국에서 정의하고 있는 표준이며, 26개의 알파벳과 그림문자를 비롯한 수학 기호를 포함하여 총 256개로 구성된다.
- 유니코드(UNICODE)
- 문자를 표현하는 데 있어서 균일하게 2바이트를 사용한다.
- 영어와 한글을 물론 전 세계의 모든 문자와 다양한 종류의 기호를 표현할 수 있고, 문자의 종류가 65,536개에 이른다.
- SBSC(Single Byte Character Set)
- 1바이트만 사용하는 방식
- 아스키코드가 대표적인 SBSC에 해당한다.
- 'SBSC 기반의 문자열' ~= '아스키코드 기반의 문자열'
- MBCS(Multi Byte Character Set)
- 다양한 바이트 수를 사용해서 문자를 표현하는 방식 (1바이트, 2바이트 혼용)
- MBCS는 SBCS를 포함하기 때문에 유니코드는 MBCS에 속하지 않는다.
- WBCS(Wide Byte Character Set)
- 2바이트만 사용하는 방식
- 유니코드가 대표적인 WBSC에 해당한다.
- 'WBCS 기반의 문자열' ~= '유니코드 기반의 문자열'
MBCS 기반의 문자열
- 메모리 공간에 1바이트를 할당하는 char 자료형을 사용하기 때문에, 문자열의 길이에 기반한 함수 호출 시 문제점이 발생한다.
WBCS 기반의 문자열
- 메모리 공간에 2바이트를 할당하는 wchar_t 자료형을 사용하여, 유니코드를 기반으로 문자를 표현하는 것이 가능하다.
- 문자열을 선언할 때, str은 앞서 wchar_t 자료형으로 유니코드 문자열을 저장할 준비가 되어있으므로 선언할 문자열 앞에 "L"을 붙여서 NULL 문자까지 2바이트로 처리하도록 한다.
- SBCS 함수나 WBCS 함수나 전달인자의 개수 및 의미는 완전히 동일하다. 하지만 SBCS 함수는 SBCS 기반 문자열뿐만 아니라 MBCS 기반 문자열 처리를 위해 사용가능하고 ,WBCS 함수는 유니코드 기반 문자열임을 잊어서는 안된다.
Note) Windows 2000 이상의 운영체제는 기본적으로 유니코드를 지원한다. 뿐만 아니라, 내부적으로 전달되는 모든 문자열을 2바이트 유니코드 형식으로 변환하여 처리한다.
02. MBCS와 WBCS의 동시 지원
#include <windows.h>
- windows.h는 Windows 기반 프로그래밍을 하는 데 있어서 기본적으로 항상 포함해야 하는 헤더 파일이다.
- windows.h는 Windows 프로그래밍에 필요한 다양한 종류의 헤더파일을 더불어 포함하기 때문에 이 헤더파일 하나로 충분한 경우가 대부분이다.
Windows에서 정의하고 있는 자료형
- windows.h를 통해 정의된 CHAR와 WCHAR
- MBCS 기반 문자열 선언
- ex) LPSTR형 변수를 선언하여 문자열의 주소 값을 메모리 공간에 할당하고, 문자열을 선언한다.
- WBCS 기반 문자열 선언
- ex) LPWSTR형 변수를 선언하여 문자열의 주소 값을 메모리 공간에 할당하고, 문자열 앞에 L을 붙여 선언한다.
MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 매크로
- Windows에서는 MBCS와 WBCS를 동시에 수용하는 형태의 프로그램 구현을 위해서 UNICODE 매크로를 정의하고 있다.
- UNICODE를 정의하는 헤더파일은 windows.h에 포함되지 않기 때문에, UNICODE 매크로를 정의하고 싶다면 추가적으로 tchar.h 헤더파일을 포함시켜야 한다.
#define UNICODE
#define _UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int wmain(void)
{
TCHAR str[] = _T("1234567");
...
}
- UNICODE라는 매크로가 정의되어 있으므로, 전처리기에 의해서 "WCHAR ... = L ..."와 같이 변경되며 이는 WBCS 기반의 문자열 저장을 가능하게 한다.
- UNICODE라는 매크로가 정의되어 있지 않으면, 전처리기에 의해서 "CHAR ... = ..."와 같이 변경되며 이는 MBCS 기반의 문자열 저장을 가능하게 한다.
MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들
- _UNICODE, UNICODE의 정의 유무에 다라서 WBCS 기반으로, 혹은 MBCS 기반으로 컴파일하고자 한다면 우리가 알고있는 문자열에 관련된 모든 ASNI 표준 함수들을 매크로를 정의해서 사용해야 하는가?
- 이러한 수고를 덜어주기 위해 tchar.h 헤더파일을 선언하여 활용하면 된다.
요약
- SBCS, MBCS, WBCS의 이해
- SBCS는 문자를 표현하는 데 1바이트를, MBCS는 문자를 표현하는 데 1바이트 혹은 2바이트를, WBCS는 문자를 표현하는 데 2바이트를 사용하는 문자셋을 의미한다.
- 유니코드(Unicode)는 WBCS에 해당한다.
- 유니코드 기반 문자열 처리 함수
- ANSI 표준 문자열 처리 함수는 별도로 유니코드에 기반하여 정의하고 있다. 이들을 사용해서 유니코드 기반으로 프로그램을 작성할 수 있어야 한다.
- UNICODE와 _UNICODE
- 매크로 UNICODE와 _UNICODE의 정의 유무에 따라서 함수의 선언형태가 달라진다. 이 두 매크로를 기반으로 유니코드 방식과 MBCS 방식의 컴파일이 가능하도록 프로그램을 작성할 수 있어야 한다.
- 유니코드 방식과 MBCS 방식을 모두 지원하기 위한 main 함수의 구성
- MBCS 방식을 지원하기 위해서 main이 존재한다면, 유니코드 방식을 지원하기 위해서 wmain이 존재한다. 그리고 이 두 가지 방식을 모두 지원하기 위해서 _tmain이 존재한다.
Reference