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; } |
: 지금까지 공부해왔던 문자열 조작 함수들은 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 = 혼합방식
|
'독후감 > 컴퓨터구조+운영체제+시스템프로그래밍' 카테고리의 다른 글
6. 커널 오브젝트와 오브젝트 핸들 (0) | 2017.03.06 |
---|---|
5. 프로세스의 생성과 소멸 (0) | 2017.03.03 |
4. 컴퓨터구조에 대한 두번째 이야기 - Part2 프로세스와 IPC (0) | 2017.03.03 |
3. 64비트 기반 프로그래밍 (0) | 2017.03.02 |
1. 컴퓨터 구조 - Part 1 컴퓨터 구조와 프로그래밍 모델 (0) | 2017.03.02 |