window에서의 유니코드(UNICODE)
아스키코드 : 미국에서 정의하고 있는 표준 알파벳 26개와 몇몇 확장문자(수학기호, 악센트 기호)등을 합쳐 256개 즉 1바이트로 표현이되는 문자들이다.
유니코드 : 영어가 아닌 다른 국가에서 사용하는 문자들을 표현하기 위해 등장했다. 유니코드는 문자를 표현하는데 균일하게 2바이트를 사용한다. 2바이트 크기인 65536개의 문자를 표현할 수 있다. 한글, 영어를 포함한 전세계의 다양한 문자, 다양한 기호를 표현가능하다.
문자셋의 종류
1.SBCS(Single Byte Character Set)
문자를 표현하는데 있어서 1바이트만 사양하는 방식. 아스키 코드가 대표적인 SBCS이다.
2.MBCS(Multi Byte Character Set)
어떤문자는 1바이트, 어떤문자는 2바이트로 표현한다. 유니코드는 MBCS에 속하지 않는다. MBCS는 SBCS를 포함하고 있다. 아스키 코드에서 정의한 문자들은 1바이트로 처리하고, 아스키코드에서 정의하지 않은 다른문자를 표현할 때는 2바이트로 처리한다. MBCS에서 영어는 1바이트로, 한글은 2바이트로 처리된다.
3.WBCS(Wide Byte Charactor Set)
유니코드가 WBCS방식에 해당한다. WBCS는 모든 문자를 2바이트로 처리하는 문자셋이다.
ex)
str = "ABC한글"
sizeof(str)은 8이다.
strlen(str)은 7이다.
8바이트가 나온것은 ABC(3바이트) + 한글(4바이트) + NULL(1바이트)해서 총 8바이트이다. 이것은 현재 MBCS 기반으로 실행되고 있는 것이다.
문자열길이는 7이라고 출력되었다. 문자열 길이에서 NULL은 제외된다. "ABC한글"은 실제로 문자열길이는 5지만 "한글"이라는 단어가 4로 인식되고 있다. 이와 같은 문제점이 MBCS의 문제점이다.
MBCS 방식의 문제점을 해결하는 것이 WBCS방식이다. WBCS방식은 모든 문자들을 2바이트로 처리한다.
WBCS 기반의 프로그래밍
WBCS 프로그래밍에서는 char 대신 wchar_t를 사용해야 한다. char형은 1바이트만 할당되지만 wchar_t형 변수는 2바이트 메모리 공간이 할당된다. wchar_t를 통해 유니코드를 기반으로 문자를 표현하는 것이 가능하다.
wchar_t의 자료형
typedef unsigned short wchar_t;
"ABC"대신 L"ABC"를 사용해야한다.
ex) wchar_t str[] = L"ABC"
문자열앞의 L은 유니코드 기반(WBCS 기반)으로 표현하라는 의미를 가지고 있다. 위 경우에는 "ABC"는 NULL을 포함해 총 8바이트로 표현된다. 유니코드에서는 NULL문자 까지도 2바이트로 처리된다.
문자열 조작 함수
SBCS WBCS
strlen size_t wcslen(const wchar_t * string);
strcpy wchar_t * wcscpy(wchar_t * dest, const whcar_t * src);
strncpy wchar_t * wcsncpy(wchar_t * dest, const wchar_t * src, size_t cnt);
strcat wchar_t * wcscat(wchar_t * dest, const wchar_t * src);
strncat wchar_t * wcsncat(wchar_t * dest, const wchar_t * src, size_t cnt);
strcmp int wcscmp(const wchar_t * s1, const wchar_t * s2);
strncmp int wcsncmp(const wchar_t * s1, const wchar_t *s2, size_t cnt);
WBCS기반 함수의 전달인자는 모두 유니코드 기반 문자열이다.
입출력 함수
printf("Hello World!");
"Hello World!"는 아스키코드에 존재하는 문자들로만 구성되어 있으므로 문자당 1바이트로 표현된다. printf함수는 SBCS기반 문자열을 처리하는 함수다. 유니코드 기반으로 작성할려면 아래와 같이 작성해야 한다.
wprintf(L"Hello World!");
printf함수의 유니코드 버전이 wprintf 함수이다.
SBCS WBCS
printf int wprintf(const wchar_t * format [ ,argument] ....);
scanf int wscanf(const wchar_t * format [ ,argument]......);
fgets wchar_t * fgetws(wchar_t * string, int n, FILE * stream);
fputs int fputws(const wchar_t * string, FILE * stream);
wmain은 프로그램 실행시 전달되는 문자열을 유니코드 기반으로 구성한다는 의미이다.
'Programming > Windows System Programming' 카테고리의 다른 글
64비트 기반 프로그래밍 (0) | 2019.11.20 |
---|---|
MBCS WBCS(유니코드) 동시지원 (0) | 2019.08.11 |
버스(Bus) 시스템 (0) | 2019.08.07 |
프로그램의 실행과정 및 하드웨어 구성의 재접근 (0) | 2019.08.07 |
시스템 프로그래밍의 이해와 접근 및 컴퓨터 구조 (0) | 2019.08.07 |