1. 문자 집합
문자 표현 집합은 크게 아래처럼 볼 수 있습니다.
SBCS (Single-Byte-Character Set)
1byte(0~255)로 표현되는 문자 집합
MBCS (MultiByte-Character Set)
1byte이상 문자 집합
UCS (Universal Character Set)
전 세계의 문자를 모두 표현할 목적으로 만들어진 국제 표준 문자 집합. 1byte 이상으로 표현
2. Microsoft의 C/C++ 컴파일러와 문자 집합
우리나라도 영어 문화권이 아닌 관계로 MBCS를 사용하거나 UNICODE를 사용합니다. 컴파일 옵션에서 간단하게 바꿀 수 있습니다.
MBCS의 특징
UNICODE의 특징
요즘 만들어지는 대두분의 프로그램은 UNICODE를 사용합니다. 만약 MBCS를 사용하는 프로그램으로 만들 경우, 국제화를 위해서 컴파일 옵션만 바꾸면 UNICODE로 컴파일되도록 코드를 작성합니다.
컴파일 옵션은 단지 UNICODE, _UNICODE 매크로를 추가하는 것뿐입니다. 컴파일 옵션 설정은 아래와 같습니다.
VC++2008의 _MBCS와 _UNICODE 설정 속성 페이지의 '구성 속성'의 '문자 집합'을 선택합니다.
_MBCS로 설정
_UNICODE로 설정
유니코드로 설정하면 _UNICODE와 UNICODE 옵션이 모두 포함됩니다. C런타임 라이브러리의 전처리 매크로는 _UNICODE를 윈도우 라이브러리는 UNICODE를 필요로 하기 때문입니다.
3. MBCS, UNICODE 문자와 문자열 코드
MBCS 문자와 문자열 예제입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> void main( ) { char c = 'A'; char *str= "ABC"; printf("%c\n", c); printf("%s\n", str); } /* 출력 A ABC */ | cs |
- UNICODE 문자와 문자열 예제
12345678910111213141516 #include <stdio.h> void main( ){ wchar_t c = L'A'; wchar_t *str= L"ABC"; wprintf(L"%c\n", c); wprintf(L"%s\n", str);} /*출력 AABC*/ cs
모든 유니코드 문자와 문자열은 L 자를 붙입니다. 또 2byte의 문자를 저장하기 위해 wchar_t라는 자료형(unsigned short형과 같은) 변수에 저장합니다. 함수는 printf() 대신 wprintf()를 사용합니다. 만약 컴파일 옵션을 사용하여 MBCS와 UNICODE에 따라 코드를 변환하려면 호환가능한 type과 문자열을 사용하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> #include <tchar.h> void main( ) { TCHAR c = _T('A'); TCHAR *str= _T("ABC"); _tprintf(_T("%c\n"), c); _tprintf(_T("%s\n"), str); } /* 출력 A ABC */ | cs |
#include <tchar.h>를 포함하고 자료형을 TCHAR로 합니다. 문자나 문자열은 _T()나 _TEXT()로 감쌉니다. 함수는 _tprintf()로 바꿉니다. 이제 위 코드는 컴파일 옵션에 따라 MBCS나 UNICODE로 컴파일됩니다.
4. 주요 매크로 정의
실제 TCHAR와 _T(), _tprintf()의 정의를 볼까요?
123456789101112 #include <stdio.h>#include <tchar.h> #ifdef _UNICODE typedef wchar_t TCHAR; #define _T(x) L ## x #define _tprintf wprintf#else typedef char TCHAR; #define _T(x) x #define _tprintf printf#endif cs
컴파일 옵션을 설정하면 _UNICODE라는 매크로가 컴파일 옵션에 정의되며 매크로 정의 여부에 따라 문자와 문자열 처리가 달라지는 것을 볼 수 있습니다.
5. PSTR, PCSTR : PWSTR, PCWSTR : PTSTR, PCTSTR
마지막으로 windows.h(winnt.h)에는 사용 편의를 위해 여러가지 typedef와 define이 정의되어 있습니다.
char* 예제입니다.
12345678910111213141516171819 #include <stdio.h>#include <windows.h> void main( ){ char *str= "ABC";}void main( ){ CHAR *str= "ABC";}void main( ){ PCHAR str= "ABC";}void main( ){ PSTR str= "ABC";} cs
- const char* 예제입니다.
12345678910111213141516171819 #include <stdio.h>#include <windows.h> void main( ){ const char *str= "ABC";}void main( ){ const CHAR *str= "ABC";}void main( ){ const PCHAR str= "ABC";}void main( ){ PCSTR str= "ABC";} cs
위 main()은 모두 같은 코드입니다.
- wchar_t* 예제입니다.
12345678910111213141516171819 #include <stdio.h>#include <windows.h> void main( ){ wchar_t *str= L"ABC";}void main( ){ WCHAR *str= L"ABC";}void main( ){ PWCHAR str= L"ABC";}void main( ){ PWSTR str= L"ABC";} cs
- const wchar_t* 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #include <windows.h> void main( ) { const wchar_t *str= L"ABC"; } void main( ) { const WCHAR *str= L"ABC"; } void main( ) { const PWCHAR str= L"ABC"; } void main( ) { PCWSTR str= L"ABC"; } | cs |
- TCHAR* 예제
123456789101112131415 #include <stdio.h>#include <windows.h> void main( ){ TCHAR *str= TEXT("ABC");}void main( ){ PTCHAR str= TEXT("ABC");}void main( ){ PTSTR str= TEXT("ABC");} cs
-const TCHAR* 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <windows.h> void main( ) { const TCHAR *str= TEXT("ABC"); } void main( ) { const PTCHAR str= TEXT("ABC"); } void main( ) { PCTSTR str= TEXT("ABC"); } | cs |
ASCII CODE 표 (0) | 2018.09.04 |
---|---|
ASCII 제어 문자표 (0) | 2018.09.04 |
BOM 이란? (0) | 2018.09.04 |
TTF 와 OTF (0) | 2017.04.29 |
폰트 정의 (0) | 2017.04.29 |
댓글 영역