출처 : 네이X 지식즐

 

 

2005(2008)에서 Windows98계열을 더이상 공식적으로 개발환경 지원을 하지않으므로

모든 프로젝트는 기본으로 유니코드를 기본값으로 설정되어있습니다.

 

그리고 유니코드 사용과 멀티 바이트 사용시의 차이점이 뭐길래 컴파일시 에러가 나는지에 대해

설명 해주시면 감사하겠습니다~^^

1.

유니코드는 문자열을 2Byte로 인식해서 처리합니다.

멀티바이트는 문자열을 상황에 따라서 여러Byte로 인식해서 처리합니다.

(영문의 경우 ANSI와 동일하게 항상 1Byte(256자)이지만 한국어의 경우  모자라기 때문에

앞에 Byte의 값을 봐서 그 내용에 따라 다음 몇Byte(1~3Byte)를 모아서 하나의 글자로

표시하는 방식입니다.)

일단, 영어권에서는 1Byte로 모든 문자가 표시가능했지만 다른 언어권에서는 1Byte가 모자라서

멀티바이트방식으로 확장되었는데 이것이 일반적으로 처리하기도 복잡하고 여러가지 문제가

발생해서 그냥 국가 언어별로 2Byte로 통일을 해버린 것이 유니코드입니다.

(유니코드의 경우 영어권에서는 1Byte로 가능한 문자도 2Byte로 처리되므로 메모리상 2배씩

사용하므로 손해이지만 다국어를 지원하기 위해 선택하게 된것이죠. 항상 2Byte이므로 처리하기도 쉽고...)

VC에서 멀티바이트는 char (1Byte), 유니코드는 unsigned short (2Byte) 타입을 이용해 처리합니다.

 

2.

모든 win32 api들은 내부적으로 문자를 유니코드로 처리합니다.

그래서 문자열 입력을 유니코드로 받는데 하위호환성(win9x)을 위해서 멀티바이트도 입력을

받을 수 있게 API를 제공합니다. ( SendMessageW (유니코드), SendMessagA (멀티바이트) )

단지 개발환경에서 SendMessage를 사용하면 컴파일전에 유니코드 사용여부에 맞게

해당되는 형태로 스위칭되는 것이죠.

ex)

#ifdef UNICODE
#define SendMessage  SendMessageW
#else
#define SendMessage  SendMessageA
#endif // !UNICODE

 

그래서 문자나 문자열을 처리 할 때도 char를 사용하지 않고 TCHAR를 사용하는 습관을 주세요

TCHAR도 유니코드에서는 unsigned short으로 멀티바이트에서는 char로 스위칭됩니다.

그냥 무작정 char로 코딩하고 유니코드로 빌드하면 함수호출이나 문자열 사용하는 부분에서

타입에러가 나는 것이죠.

(사족이지만 이밖에도 WinMain이 호출되기 전에 VC에서는 CRTStartup이라는 C/C++ 런타임라이브러리의

스텁코드를 호출하는데 이때도 type때문에 문제가 발생할 수 있습니다...)

 

 

또 하나.. 혹시 이런식으로 6.0과 2005 사이의 알려진 설정 변경 사항이나 2005 사용시 주의 할점

알고 계신 tip이 있으시면 알려 주세요~^^

기본적으로 컴파일러가 케스팅에 엄격해져서 애매모호한 형변환들을 에러로 표시합니다.

그리고 위험한 crt함수 strcpy류등을 사용하면 경고를 출력합니다.(strsafe또는 secure crt를 사용하라고 함)

또한 C언어 표준을 엄격하게 준수합니다.

ex) for(int i = 0 ; ...) 의 예제에서 int i가 for루프 밖에서도 사용가능했는데 표준에서는 for루프 에서만

사용하도록 한정하고 있습니다. for루프 밖에서 i값에 접근하는 코드들을 2005에서 에러납니다.

for루프 이전에 int i를 따로 정의해야지 접근가능합니다.

이 외에도 프로젝트에 따라서 다양한 문제가 발생하겠죠 ^^;

'Development > C/C++' 카테고리의 다른 글

소켓 함수 처리시간 측정  (0) 2011.08.13
버퍼 오버플로우(buffer overflow)  (0) 2011.08.13
랜덤함수  (0) 2011.08.13
랜덤함수 C Source  (0) 2011.08.13
디버깅용 콘솔창을 띄우자.(자바 콘솔 맹키로...)  (0) 2011.08.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,