지역별/나라별 등으로 달라지는 '문자 집합' 및 그에 관련된 '문자 인코딩 방식'을 문자 셋/집합(Chracter Set)이라 한다.
- 문자들의 집합
- 약속된 문자의 표현방법
아스키코드(ASCII CODE)와 유니코드(UNICODE)가 가장 대표적인 문자 셋(Character Set)에 해당한다.
아스키코드(ASCII CODE)
- 미국에서 정의하고 있는 표준
- 알파벳 26자에 몇몇 확장 문자를 포함해도 총 256개를 넘지 않는다.
그래서 1바이트를 가지고도 충분히 표현할 수 있다.
- 다시 말해서, 아스키코드는 1바이트로 표현된다.
유니코드(UNICODE)
- 영어가 아닌 다른 국가에서 사용하는 문자들을 표현하기 위해 등장했다.
- 문자를 표현하는 데 있어서 균일하게 2바이트를 사용한다. (65,536개의 문자를 나타낼 수 있다.)
문자셋은 종류에 따라서 크게 세 가지 형태로 나뉘어진다.
SBCS(Single Byte Character Set)
- 문자를 표현하는 데 있어서 1바이트만을 사용하는 방식
- 아스키코드가 대표적인 SBCS에 해당한다.
MBCS(Multi Byte Character Set)
- 동일한 바이트 수를 적용하는 것이 아니라, 다양한 바이트 수를 사용해서 문자를 표현하는 방식
어떤 문자는 1바이트로 표현하고, 어떤 문자는 2바이트로 표현한다.
- 유니코드는 MBCS에 속하지 않는다.
MBCS는 SBCS를 포함하기 때문이다.
그래서 대부분의 문자들을 2바이트로 처리하되, 경우에 따라서는 1바이트로 처리한다.
- 아스키코드에서 정의하고 있는 문자는 1바이트로 처리하고, 아스키코드에서 정의하지 않는 문자만 2바이트로 처리한다.
→ MBCS에서 영어는 1바이트, 한글은 2바이트로 처리된다.
WBCS(Wide Byte Character Set)
- 유니코드가 WBCS 방식에 해당한다.
- 모든 문자를 2바이트로 처리하는 방식
WBCS 기반(유니코드 기반)의 프로그래밍을 위해 신경 써야 할 것
1. char을 대신하는 wchar_t
문자를 표현하는 데 사용되는 자료형 char 대신 자료형 wchar_t를 사용해야 한다.
char형 변수는 1바이트 메모리 공간만 할당되지만, wchar_t형 변수는 2바이트 메모리 공간이 할당된다.
따라서 유니코드를 기반으로 문자를 표현하는 것이 가능하다.
2. "ABC"를 대신하는 L"ABC"
wchar_t str[] = "ABC";
wchar_t를 이용한 문자열의 선언을 다음과 같은 형태로 하면 문제가 발생한다.
배열 str은 유니코드 문자열을 저장할 준비가 되어 있음에도 불구하고, 대입 연산자의 오른쪽에 존재하는 문자열은 여전히 MBCS 기반 문자열이기 때문이다.
그러므로 위의 문장을 다음과 같이 변경해야 한다.
wchar_t str[] = L"ABC";
문자열 앞에 선언된 L은 이어서 등장하는 문자열을 유니코드 기반(WBCS 기반)으로 표현하라, 라는 의미를 지닌다.
따라서 wchar_t를 이용해 선언한 문자열 "ABC"는 널 문자를 포함해서 총 8바이트로 표현된다. 유니코드에서는 문자의 끝을 의미하는 널 문자까지도 2바이트로 처리된다.
MBCS와 WBCS를 동시에 지원하기 위해서는 매크로를 사용하면 된다.
적절한 형태로 tchar.h에 선언되어 있으므로, tchar.h를 활용하면 된다.
더 읽어보면 좋을..~
'OS > Windows' 카테고리의 다른 글
[OS/Windows] 4. 컴퓨터 구조에 관한 두 번째 이야기 (0) | 2023.10.06 |
---|---|
[OS/Windows] 3. 64비트 기반 프로그래밍 (0) | 2023.09.24 |
[OS/Windows] 1. 컴퓨터 구조에 대한 첫 번째 이야기 (0) | 2023.08.18 |