Unicode : 전세계의 모든 문자를 표현하기 위하여 각 문자에 숫자를 연결한 테이블
전세계에서 사용하고 있는 26개 언어의 문자와 특수기호에 대해 일일이 코드값을 부여하고 있다. 최대로 수용할 수 있는 문자수는 6만 5,536자이다. 이 가운데 3만 8,885자는 주요 국가의 언어를 구현하는 용도로 이미 할당되어 있고 6400자는 사용자 정의 영역으로, 나머지는 2만여 자는 새로 추가될 언어 영역으로 각각 비워두고 있다. 코드 할당비율을 보면 한자가 39.89%로 가장 많고, 한글 17.04%, 아스키 및 기호문자 10.39% 등의 순이다
Unicode 인코딩 종류
UTF-8 : 영문자는 1 바이트(8비트)로, 그 외의 문자는 2~4 바이트로 표현함
UTF-16 : 모든 문자를 2~4바이트로 표현함, Windows NT 운영체제부터 적용되고 있는 방식
UTF-32 : UCS-4와 동일하나 17개 언어만 정의한다는 점에서 UCS-4의 부분집합이라고 할 수 있다
UCS-2(Universal Character Set 2(octets)) : 한 문자를 2바이트로 고정하여 표현함, 일반적으로 유니코드라고 불림
UCS-4 (Universal Character Set 4(octets)) : 한 문자를 4바이트로 고정하여 표현함, 인코딩 방법일 뿐만 아니라 문자코딩 자체임
한글 인코딩의 종류
KSC5601 : 한글 완성형 표준(한글 2,350자표현), 한국공업표준 정보처리분야( C )의 5601번 표준안
KSC5636 : ASCII 코드를 확장하여 한글을 표현하므로 ASCII와 호환되며 역슬래시 대신 원화기호를 사용한다는 점이 ASCII와 다르다
EUC-KR : Bell 연구소에서 제안한 한글표현 방식, 영문은 KSC5636, 한글은 KSC5601으로 처리. 완성형 코드라서 조합형 코드에 비해 문자표현 수에 한계가 있다
MS949(CP949) : 마이크로소프트의 윈도우 95에서 사용하기 시작한 한글 표현방식, 조합형은 아니지만 EUC-KR형식을 확장하여 더 많은 한글을 표현함
Unicode를 표현하기 위한 데이터 타입
Wide Character : 각국 문자는 2바이트로 고정되어 있기 때문에 프로그램에서 문자를 다루기가 쉽다
C/C++ 언어에서 wchar_t 라는 자료형으로 표현됨
다양한 문자표현 방식
SBCS (Single-Byte Character Set) : 1바이트로 영문자 한개를 표현, ASCII코드체계는 SBCS에 속한다
DBCS (Double-Byte Character Set) : 한개의 문자를 2바이트로 표현, SBCS와 호환이 안되어 MBCS가 고안됨. 각국에서 비표준적으로 사용됨
MBCS (Multi-Byte Character Set) : 한개의 문자는 1~2바이트로 표현됨, 서로다른 언어 안에 동일한 코드를 가질 수 있는 문제가 있으므로 각 언어셋을 설정해야 하는 단점이 있다, ANSI, UTF-8, UTF-16 등은 MBCS에 속한다
WBCS : 국제표준문자집합으로 유니코드를 지원하기 위한 방식. 각국 언어가 한 테이블에 정의되므로 각 언어를 표현하는 언어셋이 필요없다
MBCS와 WBCS의 차이점
MBCS는 언에 관계없이 동일한 영역으로 사용하므로 특정언어셋을 사용한다라고 선언해줘야 그 언어셋에 한해서만 사용이 가능하다.
WBCS는 전세계 모든 문자들이 국제표준에 따라 매핑되어있기 때문에 특정 언어셋의 선언없이, 전세계문자의 표현이 가능하다
VC++에서는MBCS와 Unicode가 사용되며 2바이트를 넘는 문자는 지원되지 않는다
ANSI :1바이트(8비트)로 영문자와 서유럽문자, 몇개의 특수문자를 표현할 수 있으며, SBCS (Single-Byte Character Set)에 속한다
C/C++ 에서 char 라는 자료형으로 표현된다
Unicode문자와 TCHAR 자료형
TCHAR/_TCHAR : 마이크로소프트사에서 만든 문자열 타입. 동일한 기능
VC에서는 컴파일 타임에 지정된 옵션에 따라서 MBCS, Unicode 형식이 적용됨, 즉, 설정옵션에 따라서 wchar_t 혹은 char 형으로 변환되어 컴파일 됨
TCHAR : winnt.h에 선언되어 있으므로 <windows.h>를 포함하는 코드에서 사용할 수 있다. VC를 사용하는 대부분의 환경에서 사용가능
_TCHAR : tchar.h에 선언되어 있다. VC가 아닌 컴파일러에서 윈도우 프로그래밍을 할 때 사용
TCHAR는 Windows SDK에 포함되어 있고 _TCHAR은 CRT에 포함되어 있다
TCHAR 자료형을 사용하면 MBCS, Unicode 방식을 가리지 않고 동일한 방법으로 코드를 작성할 수 있는 장점을 가지게 된다
마이크로소프트에서는 TCHAR 자료형을 사용하더라도 ANSI 표준 자료형으로 정해진 것은 아니다. 그러므로 VC가 아닌 다른 환경에서는 개발자가 변수이름으로 TCHAR 이라는 변수를 선언하는 실수를 범할 가능성도 있으므로 좀더 입력이 까다로운 _TCHAR 이라는 키워드를 사용하게 된것이다.
ANSI 규정에 따라 특정 컴파일러에 특화된 자료형 앞에는 '_' 문자를 붙이게 된 것이다
char ch = 'A'; // 1바이트
char * str = "Hello";
char ch = '가'; // 2바이트
char * str = "A와B"; // 영문자는 1바이트, 한글문자는 2바이트
C/C++ 언어에서 유니코드 문자임을 표현하는 방법
wchar_t wch = L'A'; // 2바이트
wchar_t * wstr = L"Hello"; // 유니코드 문자열을 나타냄
wchar_t wch = L'가'; // 2바이트
wchar_t wstr = L"A와B"; // 한 문자당 2바이트
VC 개발환경의 설정옵션에 따라서 MBCS, Unicode 자동 설정 방법 ( TCHAR 자료형과 _T() 매크로를 사용)
#include <tchar.h> // _T() 매크로는 tchar.h 안에 선언되어 있다
TCHAR ch = _T('A');
TCHAR str = _T("Hello");
Unicode 문자를 처리하는 함수들
유니코드문자열을 처리하는 함수는 전통적인 이름 앞에 wcs혹은 _wcs 가 붙어 있는 특징이 있다.
TCHAR 자료형을 사용한 이유로 인하여 컴파일되는 문자가 유니코드인지 아닌지를 구별할 수 없는 경우에는 자동으로 유니코드 문자열을 처리하는 함수들이 사용되도록 전통적인 함수이름 앞에 _tcs가 붙어 있는 함수들을 사용할 필요가 있다
예)
전통적인 문자열 길이 확인을 위함 함수 : strlen()
유니코드 문자열의 길이를 확인하는 함수: wcslen()
TCHAR를 사용한 문자열의 길이를 확인하는 함수 : _tcslen()