MBCS와 유니코드
MBCS(Multi Byte Character Set)
- char형
- 영문 한 글자는 1바이트, 한글 한 글자는 2바이트
- 버전이 낮은 VS 환경의 기본 설정
Unicode
- wchar_t형
- 영문, 한글 모두 한 글자에 2바이트 사용
- 문자열 앞에 'L'을 붙여서 구분
- TEXT(), _T() 매크로 사용
Visual Studio 6.0같은 낮은 버전에서는 MBCS가 기본 설정이였다.
그러나 NT계열로 넘어가면서 Unicode를 사용하게 된다.
원래 "Hello"라는 문자열을 사용했다면 Unicode로는 L"Hello"가 된다.
#include <iostream>
int main() {
const char* pszBuffer = "Hello";
const wchar_t* pwszTest = L"Hello";
std :: cout << pszBuffer << std :: endl;
std :: cout << pwszTest << std :: endl;
return 0;
}
pszBuffer의 메모리에는 (Hello) 48 65 6c6c 6f 로 잘 들어갔다.
pwszTest의 메모리에는 (World) 57 00 6f 00 72 00 6c 00로 문자 사이사이에 널이 들어간다.
H | e | l | l | o | Null |
W | Null | o | Null | r | Null | l | Null | d | Null |
넓게 하나에 16비트(2바이트)씩 들어가서 와이드 캐릭터라 칭한다.
여기서 주소값으로 출력되니 (const char*)로 출력을 하면 제일 앞글자인 H만 출력된다.
H뒤에 Null 문자가 있기때문에 문자열이 종료된줄 알고 H만 출력하는 것이다.
TCHAR szBuffer[32] = { TEXT("TEST) };
TCHAR로 선언했을때는 내 설정이 멀티바이트 문자로 돼있으면 MBCS로, 유니코드 문자 집합 사용으로 돼있으면 유니코드형이다.
MFC에서 파일을 만들면 ~.exe 와 ~.dll 와 ~.lib 파일이 만들어진다.
1. 여기서 세 파일은 모두 언어(문자집합)가 통일되어야 한다.
dll이나 lib는 끌어온거기때문에 내가 맘대로 바꿀 수 없다.
2. 빌드 모드도 맞아야 한다.