오늘은 윈도우에서사용하는 문자셋관련하여 블로그를 작성하려고합니다.
참고로 윤성우저자님의 윈도우시스템프로그래밍 2장을 공하고 작성했습니다.
문자셋은 크게 3가지로 나눌수 있습니다.
1. SBCS(Single Byte Character Set)
- 문자를 표현하는데 1바이트만 사용하며
대표적인 예로 아스키코드가 있습니다.
2. MBCS(Multi Byte Character Set)
- 문자를 표현하는데 1바이트와 2바이트를 모두 사용하며
대표적으로 한글은 2바이트 영어는 1바이트를 사용하는
우리가 C언어를 공부하면서 사용하는 char 이 있습니다.
예제1을 보면 ABC는 각각 1바이트씩 3바이트 한글은
2바이트씩 4바이트를 사용합는 것을 볼 수 있습니다.
3. WBCS(Wide Byte Character Set)
- 문자를 표현하는데 무조건 2바이트를 사용하며
대표적인 예로 유니코드가 있습니다.
여기서 알 수 있는것은 한글과 영문을 모두 사용할 때 MBCS또는 WBSC를 사용해야한다는것인데 각각의 장단점을 보면
MBCS는 용량으로보면 효율적일 수 있지만 프로그래머가 코딩하는데 어려움이 있으며 때문에 안정성이 떨어지고
WBCS는 용량은 비효율적이나 프로그래머가 코딩하는데 편하고 안정성이 높다는 것입니다.
결론적으로는
최근 컴퓨터 사양이 좋아지면서 WBCS를 사용해도 메모리적인 문제는 거의 없기때문에 WBCS를 사용하려고하는 추세입니다.
하지만 MBCS를 사용하거나 예전 컴퓨터와의 호환성을 때문에 MBCS와 WBCS를 모두 고려한 코딩이 필요합니다.
--예제1---------------------------------------
char str[] = "ABC한글";
int size = sizeof(str);
int len = strlen(str);
printf("배열의 크기 : %d \n" , size );
printf("문자열 길이 : %d \n" , len );
---출력---
배열의 크기 : 8
문자열 길이 : 7
------------
------------------------------------------------
먼저 MBCS코딩은 우리가 항상 하던 코딩으로 예제1만 봐도 바로 알 수 있기때문에 WBCS코딩법을 알아보려고 합니다.
WBCS코딩방법은 두가지입니다.
첫째 char를 대신하여 wchar_t를 사용
둘째 "ABC" 대신 L"ABC" 와같이 앞에 L 을 붙임
한가지더 알아야할 것은 MBCS타입으로 코딩하던 함수들도 인자값이 달라지기때문에 보통 기존함수이름 앞에 w를 붙여 사용합니다.
예를 들면
int main(int argc, char *argv[]) ->
int wmain(int argc, wchar_t *argv[])
printf("배열의 크기 : %d \n" , size );
wprintf(L"배열의 크기 : %d \n" , size );
처럼 사용합니다.
아래는 유니코드 코딩 예입니다.
--예제2---------------------------------------
wchar_t str[] = L"ABC";
int size = sizeof(str);
//int len = strlen(str);
//strlen의 인자가 char*형인데 str은 wchar_t* 타입 이기때문에 에러!!
int len = wcslen(str);
//printf("배열의 크기 : %d \n" , size ); //유니코드기반이 아님
//printf("문자열 길이 : %d \n" , len ); //유니코드기반이 아님
wprintf(L"배열의 크기 : %d \n" , size );
wprintf(L"문자열 길이 : %d \n" , len );
---출력---
배열의 크기 : 8
문자열 길이 : 3
------------
------------------------------------------------
유니코드로 코딩하는방법도 알았는데 WBCS와 MBCS를 모두 고려한 코딩은 어떻게 해야하는 걸까요?
매크로에 답이있는데
아래는 몇가지만 가지고온겁니다.
--------------------------------------------------------------
#define __T(x) __TEXT(x)
#define _T(x) __TEXT(x)
#ifdef UNICODE
#define __TEXT(x) L ## x
#define _tmain wmain
#define _tprintf wprintf
#else /* ndef UNICODE */
#define __TEXT(x) x
#define _tmain main
#define _tprintf printf
#endif /* _INC_TCHAR */
---------------------------------------------------------
대략 살펴보겠습니다.
_tprintf 와같이 코딩을하면
UNICODE일때는 wprintf
UNICODE가 아닐때는 printf 로 변환해줍니다.
결론은!!!
_tprintf 나 _T("") 와같이 코딩을 해주면 모든 캐릭터셋에서 버그없이 사용가능합니다.
'프로그래밍' 카테고리의 다른 글
1_소켓프로그래밍의 주요함수 (0) | 2017.12.12 |
---|---|
윈도우시스템프로그래밍_03.32비트 64비트 구조 및 차이 (0) | 2017.03.22 |
윈도우시스템프로그래밍_01.컴퓨터구조의 이해 (0) | 2017.01.16 |
ARM데이터시트_SysTick Timer 레지스터(STK_CTRL/STK_LOAD/STK_VAL) (0) | 2016.12.18 |
ARM데이터시트_Systick 우선순위 및 발생 시점 (0) | 2016.12.18 |
댓글