: main이 아닌 다른 이름의 프로그램 시작점이나, 기본 자료형이 아닌 다른 이름의 자료형을 보고 있자면 마음에 부담을 느끼는 사람이 있다. 그러나 이를 알고보면 프로그래머의 편의를 위해서 제공되는 것들이다. 이를 이해하기 위해서는 우선 UNICODE에 대한 지식을 갖추어야 한다.

1. Windows에서의 유니코드(UNICODE)

: 컴퓨터 분야에 있어서 문자열을 표현하고 처리하는 일은 오래전부터 골칫거리에 속해왔다

: 운영체제가 문자열을 표현하는 방법에서부터 이야기를 진행해보자.


* 문자셋(Character Sets)의 종류와 특성

- 아스키 코드

: 미국에서 정의하고 있는 표준이다.

: 알파벳 + 확장 문자를 포함해도 256개를 넘지 않는다

: 그로므로 아스키 코드는 1byte를 가지고 충분히 표현할 수 있다.

- 유니코드

: 영어가 아닌 다른 국가에서 사용하는 문자들을 표현하기 위해 등장했다.

: 2byte의 길이를 가지며 65,536개의 문자의 종류를 가진다.

: 영어, 한글, 전세계의 언어 모든 문자, 기호를 표현할 수 있다.


- 문자셋

: 문자들의 집합, 약속된 문자의 표현방법을 뜻한다.

: 세가지 형태를 가진다

SBCS(Single Byte Character Set)

: 문자를 표현하는데 있어서 1byte만을 사용한다. 

: 대표적으로 ASCII Code가 이에 속한다

MBCS(Multi Byte Character Set)

: 문자를 1byte와 2byte를 혼용해서 표기한다.

: 아스키코드를 표현할 때에는 1byte로, 그 이외의 문자는 2byte로 표기한다.

: 효율적이지 모르겠지만 구현하는데 세심한 주의가 필요하다

WBCS(Wide Byte Chracter Set)

: 모든 문자를 2byte로 처리하는 문자 셋이다.

: UNICODE가 이에 해당된다.


* MBCS 기반의 문자열

: 영문은 1byte로, 한글은 2byte로 처리되며 배열의 크기는 NULL문자(1byte)를 더 포함하게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
    MBCS1.cpp
*/
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="ABC한글";
    int size=sizeof(str);
    int len=strlen(str);
 
    printf("배열의 크기 : %d \n"size);
    printf("문자열 길이 : %d \n", len);
 
    return 0;
}
cs

ex)

sizeof("ABC한글") == 8

strlen("ABC한글") == 7

* WBCS 기반의 프로그래밍

- char을 대신하는 wchar_t

: typedef unsigned short wchar_t; 로 선언되어져 있는 자료형이다.

- "ABC"를 대신하는 L"ABC"

: L 이후에 등장하는 문자열을 유니코드 기반(WBCS)로 표현하라라는 뜻

: 문자열의 끝을 의미하는 NULL 도 2byte로 처리된다.

- strlen을 대신하는 wcslen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
    WBCS1.cpp
*/
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    wchar_t str[]=L"ABC";
    int size=sizeof(str);
    int len=wcslen(str);
 
    printf("배열의 크기 : %d \n"size);
    printf("문자열 길이 : %d \n", len);
 
    return 0;
}

cs

: 지금까지 공부해왔던 문자열 조작 함수들은 MBCS기반 문자열을 처리하기 위한 함수였다는 것을 알 수 있다.

: 이처럼 SBCS 함수와 WBCS기반의 문자열 조작함수는 다르므로 경우에 따라 찾아서 활용하는게 바람직하다.

: 다음은 유니코드 기반의 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 
    WBCS4.cpp
*/
#include <stdio.h>
 
int wmain(int argc, wchar_t* argv[])
{
    int i;
    for(i=1; i<argc; i++)
    {
        fputws(argv[i], stdout);
        fputws(L"\n", stdout);
    }
 
    return 0;
}
cs


2. MBCS와 WBCS의 동시지원

: 프로그램은 한번만 구현하고 별다른 변경없이 MBCS기반, WBCS기반으로 돌아가는 형태로 컴파일이 가능하다면 아주 효율적일 것이다.


* #include<windows.h>

: windows 기반 프로그래밍을 하는데 있어서 기본적으로 항상 포함하는 헤더이다.

* Windows 에서 정의하고 있는 자료형

: windows 에 MBCS기반, WBCS기반의 자료형이 다르게 존재하고 있다.

* 왜 기본 자료형까지도 프로그래머들과 Windows는 자신의 스타일로 재 정의하고 사용할까?

1. 선언의 편리성이다. 

: 복잡한 선언을 단순하게 해준다.

2. 확장의 용이성

: 변경이나 사용이 다르게 되었을때 확장성이 좋아진다.

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
/* 
    WinString.cpp
*/
#include <stdio.h>
#include <windows.h>
 
int wmain(int argc, wchar_t* argv[])
{
    LPSTR str1="SBCS Style String 1";
    LPWSTR str2=L"WBCS Style String 1";
 
    CHAR arr1[]="SBCS Style String 2";
    WCHAR arr2[]=L"WBCS Style String 2";
 
    LPCSTR cStr1=arr1;
    LPCWSTR cStr2=arr2;
 
    printf("%s\n", str1);
    printf("%s\n", arr1);
 
    wprintf(L"%s\n", str2);
    wprintf(L"%s\n", arr2);
 
    return 0;
}
 
cs

* MBCS와 WBCS를 동시에 지원하기 위한 매크로

: <tchar.h> 를 통해서 이미 정의된 매크로를 사용하면, UNICODE를 사용하겠다고 선언한 것의 여부에 따라 자동으로 자료형, 함수를 UNICODE 형태 혹은 아닌 형태로 변경하여준다.


결론

: main = MBCS방식

: wmain = 유니코드 방식

: _tmain = 혼합방식


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


+ Recent posts