안녕하세요 삽잡이입니다.
이번 시간에는 유니코드와 멀티바이트에 대해서 알아보려고합니다.
우선 멀티바이트 코드는, MBCS 즉, 문자 집합을 여러개의 바이트를 써서 표현합니다.
유니코드와 멀티바이트는 표현하는 것은 같습니다.
하지만, MBCS의 경우 MS에서 만든 것 즉, 표준이 아닙니다.
결국 둘의 차이는 표준이냐 표준이 아니냐의 차이이군요...
뭔말이냐면 MBCS 방식은 표준이 아니기 때문에
MS계열의 OS가 아니라면 모른다 이겁니다... 인식을 못한다 이거죠...
어찌됬든간에... 지난 시간의 내용을 잠시 복습해보자면...
유니코드는 '문자에 대한 정의 숫자'일 뿐입니다. 그 숫자를 어떠한 형태로 정의할 것인지가 인코딩이구요...
인코딩 방식에는 여러가지가 있는데 표준이 2바이트로 표현하는 방식이라는 것...
그리고 표현할 수 없는 문자들은 대부분 4바이트로 표현한다는것...
왜냐, 대부분의 문자가 2바이트로 표현될 수 있으니까요...
기존의 MS 계열 프로그램들은 MBCS 방식으로 만들어졌었는데,
요즘 추세는 Unicode를 더 많이 사용하는 추세이다 보니, 서로 호환가능하도록 만들게 되어진 것 같습니다.
UTF-16과 MBCS를 Visual Studio에서 지원을 하는데,
C, C++은 비교적 오래된 언어로써,
문자 코드에 대한 정의가 없습니다. 따라서 자료형식으로 구분을 해줘야합니다.
유니코드에서는 유니코드를 사용하는 것을 알리기 위해서 L을 앞에 붙여줍니다.
L 을 써야만 유니코드를 뜻하기 때문에 컴파일러가 알아볼 수 있게 되는 것이지요....
또한, wchar_t는 2바이트짜리 메모리 형식입니다.
그 외에는 char와 같죠...
(물론, 개발환경... 즉, 컴파일러 환경에 따라서 2바이트 이상이다.)
윈도우즈 API에서는 C, C++과 차이를 두기 위해서
char를 CHAR, char* 를 LPSTR, const char*를 LPCSTR로 정의하고 있습니다.
API 내에서는 위의 자료형식도 정의되어있음으로 둘다 써도 된다는 것입니다.
물론, wchar_t는 WCHAR, wchar_t*는 LPWSTR, const wchar_t*는 LPCSTR라고 정의 되어있습니다.
다시 말하지만 누굴 써도 똑같습니다...
그런데 고민이 있습니다...
MBCS로 개발하면 Unicode로 업그레이드를 할 때 문제가 생깁니다.
또한, 그 반대도 마찬가지구요...
서로 다른 언어 코드형식으로 서로 바꿔줘야하는 문제가 있다는 것입니다.
그래서 중간 타입 즉, 호환 타입을 만들었습니다.
_T, _TEXT 메크로입니다.
_T"Sapzape" 이런식으로 붙일 수 있다는 것입니다.
전처리기에 _UNICODE가 정의 되어있다면 unicode로
아스키코드가 정의 되어있으면 MBCS 로 사용가능하도록 해줍니다...
L을 붙였다 떼줬다 해주는 것이죠...
즉, 중립형 자료 형식을 사용했기 때문에 유니코드 / 멀티바이트 호환을 가능하게 해주는 것입니다.
여담으로 API에서는 문자와 문자에 관련된 것들은
호환 가능한 T가 붙은 친구들, 그리고 API에서 정의된 자료형을 쓰는 것이 좋습니다.
물론, 성능에는 문제 없습니다...
자... 그래서 아무튼 우리는 유니코드와 멀티 바이트 코드에 대해서 알아봤습니다.
그런데, 한가지 문제가 더 생겼습니다... 바로 함수를 사용할 때 입니다...
이렇게 처음 문자열을 명시할 때 오류가 생긴다 이겁니다...
왜 그럴까요? CreatWindow 함수에서 받는 매개 변수의 문자열이
유니코드인지 아스키코드인지에 대해서 맞지 않기 때문입니다..
따라서, 모든 문자열을 사용하는 부분이 하나라도 있다면, A, W로 끝나는 함수들을 무조건 제공합니다.
A로 끝나는 함수는 멀티 바이트 문자열을 받는, W로 끝나는 함수는 유니코드를 문자열을 받는 함수입니다.
A는 아스키코드 즉, 멀티바이트를 뜻하고,
W는 유니코드를 뜻합니다.
사실 위의 예제 코드는 그냥 CreateWindow 함수가 아니라 CreateWindowW 함수였던 것입니다.
이 처럼 [프로젝트] 속성에서 멀티바이트로 문자열을 받을지,
아스키코드 문자열을 받을지 결정이 되는 것입니다.
유니코드 혹은 멀티 바이트 코드를 바꾸기 위해서는
[프로젝트] > [속성] > [문자 집합] 에서 변경을 하게 되는데,
문자 집합 형식을 바꾼 다음
[C/C++] > [명령줄] 에서 변경된 코드의 메크로가 추가되는 것을 확인하실 수 있습니다.
이렇게 말입니다...
이상 삽잡이였습니다!
'삽질의 현장 > - ETC' 카테고리의 다른 글
[삽잡이] 원자적인 연산의 중요성 (0) | 2015.10.06 |
---|---|
[삽잡이]WinSock2 헤더 사용시 주의사항 (0) | 2015.10.05 |
[삽잡이] 유니코드(Unicode) (0) | 2015.09.25 |
[삽잡이] 0, NULL, \0? (0) | 2015.09.18 |
[삽잡이] 개발 잘하는 방법 (코딩 잘하는 방법) (2) (0) | 2015.07.25 |