일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 방탈출
- 꽃길
- 윈도우 프로그래밍
- 방탈출 후기
- 넥스트에디션 2호점
- 개발
- 이스케이퍼스 2호점
- 시스템 프로그래밍
- 넥스트에디션
- 방탈출 추천
- 이스케이퍼스
- C#
- Unity
- PC VR
- C++ 자료구조
- 후기
- 홍대 방탈출
- 홍대 방탈출 추천
- 강남 방탈출
- 필활
- 홍대 덤앤더머
- 홍대
- 정렬 알고리즘
- Android
- C 자료구조
- 유니티
- 2021 방탈출 추천
- 방탈출 리뷰
- 추천
- 공포 방탈출
- Today
- Total
행복한 연어의 이야기
(윈도우 시스템) 2. 아스키코드 vs 유니코드 본문
1. Windows 에서의 유니코드(UNICODE)
문자셋의 종류와 특성
SBCS(Single Byte Character Set)
Single Byte 즉 문자를 표현하는데 1Byte를 사용하는 문자
아스키코드가 여기에 속한다.
MBCS(Multi Byte Character Set)
Multi Byte 어떤 문자는 1Byte 어떤 문자는 2Byte 를 사용한다.
MBCS는 SBCS 를 포함하는 개념이며 아스키 코드가 표현할 수 있는 문자열일 경우 SBCS
그 외의 문자의 경우 MBCS 에 속한다.
WBCS(Wide Byte Character Set)
Wide Byte 모든 문자를 2Byte로 표현한다.
유니코드가 여기에 속한다.
MBCS 기반의 문자열
현재 우리가 사용하는 운영체제의 기본 방식은 MBCS 이다.
MBCS 는 1바이트 문자(영어)와 2바이트 문자(한글)을 혼용하기 때문에
문자열의 길이와 바이트의 길이가 맞지 않는다거나 등 문제가 발생할 수 있다.
이를 해결하기 위해서 모든 문자열을 2바이트로 처리하는 WBCS 이 해결책이 될수 있다.
WBCS 기반의 프로그래밍
WBCS 기반(유니코드)으로 프로그래밍 하기위해서는 몇가지 주의점이 있다.
char 대신 wchar_t 사용하기
char 는 1byte 를 할당하지만 wchar_t 는 2byte를 할당한다.
"ABC" 대신 L"ABC"
사용하는 문자열 앞에 L 을 붙여 유니코드기반 문자열로 바꿔준다.
"ABC" 는 MBCS 기반 문자열이고 L을 붙이면 WBCS 기반으로 바뀐다.
문자열 조작 함수
기존에 사용하던 문자열 함수들은 SBCS 기반으로 작동한다.
문자열 조작 함수들도 WBCS 기반 함수들을 사용해야한다.
strlen -> wcslen, printf -> wprintf 등 (매개변수도 WBCS 기반 문자열이어야 한다.)
메인 함수
메인 함수또한 main 에서 wmain 으로 바꿔주어야한다.
그래야 프로그래심 시작시 전달되는 문자열이 WBCS 기반으로 들어오게 된다.
2. MBCS 와 WBCS 동시 지원
위 방법대로 문자열을 쓸때마다 다 바꿔서 작성하는 것은 쉬운일이 아니다.
또한 모든 시스템이 WBCS 기반을 지원하는 것이 아니기 때문에 무턱대고 WBCS만을 고집하면
문제가 발생할 확률이 높다.
그러니 MBCS 와 WBCS 를 동시 지원하는 방법에 대해서 알아보자
Windows 에서 정의하고 있는 자료형
windows.h 를 살펴보면 typedef 를 통해서 정의하고 있는 자료형이 있다.
간단하게 몇가지만 살펴보자
typedef char CHAR
typedef wchar_t WCHAR
typedef CHAR * LPSTR
typedef WCHAR * LPWSTR
MBCS와 WBCS 를 동시에 지원하기 위한 매크로
이 또한 Windows 에서 정의되어 있는 부분 중에 하나이다.
#ifdef UNICODE
typedef WCHAR TCHAR
typedef LPWSTR LPTSTR
#else
typedef CHAR TCHAR
typedef LPSTR LPTSTR
이제 TCHAR 을 사용한다면
#define UNICODE
유무에 따라 MBCS 와 WBCS 가 바뀌는 것을 확인할 수 있다.
또한 관련 함수 또한 매크로 정의를 해주어야 하는데
함수는 windows.h 가 아닌 tchar.h 안에 있으며
#define _UNICODE
로 정의를 해주어야 한다.
위 #define 선언은 관련 헤더파일을 불러오기 전에 정의를 해주어야 작동한다.
간단하게 정리 하자면
mian() = MBCS
wmain() = WBCS
_tmain() = #define 유무에 따른 MBCS, WBCS 사용
알고 넘어가야할 것
1. SBCS, MBCS, WBCS 의 이해
2. 유니코드 기반 문자열 처리 함수들
3. UNICODE 와 _UNICODE
4. MBCS 방식과 WBCS 방식을 모두 지원하기 위한 main 함수 구성방법
'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.
'IT > 윈도우 시스템 프로그래밍' 카테고리의 다른 글
(윈도우 시스템) 6. 커널오브젝트와 오브젝트 핸들 (0) | 2021.07.30 |
---|---|
(윈도우 시스템) 5. 프로세스 생성과 소멸 (0) | 2021.07.28 |
(윈도우 시스템) 4. 컴퓨터 구조 두번째 (0) | 2021.07.26 |
(윈도우 시스템) 3. 64비트 기반 프로그래밍 (0) | 2021.07.23 |
(윈도우 시스템) 1. 컴퓨터 구조 첫번째 (0) | 2021.07.19 |