윈도우 환경의 C++ 프로그래밍을 하다 보면 멀티바이트, 유니코드라는 문자집합 때문에 고민하게 된다.
프로젝트를 생성하게 되면 기본적으로 유니코드 환경으로 설정되어 있으나, 과거 하위버전의 Visual Studio에서 작성한 프로젝트이거나, 기타사유로 멀티바이트로 변경한 프로젝트를 다시 유니코드 환경으로 설정하면 당연히 컴파일 오류가 발생한다.
구분 | 유니코드(_UNICODE) | 멀티바이트(_MBCS) |
기본 자료형 | wchar_t | char |
단일 문자의 크기 | 2Byte (16bit) | 1Byte ~ 2Byte (영문, 숫자를 포함한 ASCII는 1바이트로 표현되고 나머지 한글, 한자, 일본 가나 등은 2바이트로 표현) |
포함하는 문자셋 | 와이드 문자 및 u t f-16으로 인코딩된 문자열 | 유니코드를 제외한 문자셋 (ANSI, UTF-8 등) |
기존 멀티바이트 환경에서는 문자열을 입력할 때 큰따옴표(" ") 안에 정의했지만, 유니코드 환경에서는 큰따옴표 앞에 대문자 L을 넣어줘야한다.
TCHAR에서 제공하는 통합형 매크로는 TEXT나 _T를 큰따옴표 앞에 넣어주면 된다.
예시
멀티바이트 환경에서 문자열 정의:
char chTest[50] = "ABCDEFG";
유니크도 환경에서 문자열 정의:
wchar_t wchTest[50] = L"ABCDEFG";
TCHAR 통합형 매크로:
TCHAR tchTest[50] = TEXT("ABCDEFG"); //또는 _T("ABCDEFG");
#ifdef _UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR; #endif
위 코드에서 보면 _UNICODE가 정의되었냐에 따라 새로 정의된 자료형 이름이 둘다 TCHAR인것을 확인 할 수 있는데,
이것은 유니코드, 멀티바이트 모두 TCHAR를 사용할 수 있으며, 각 정의에 따라 자동으로 WCHAR와 char로 매크로가 된다는 의미이다.
따라서 TCHAR 매크로를 쓰게되면 유니크도, 멀티바이트 환경을 개발자가 고민할 필요가 없다는 것이다.
프로젝트 설정에 따라 내부적으로 매크로가 되니깐.
뿐만아니라 문자열 함수(strcpy 등)도 정의에 따라 나눠지게 된다. (자세한 내용은 tchar.h 파일에서 확인하면 된다. 너무 많아서 ㅠㅠ)
대표적인 함수 몇개를 정리해보았다.
- 기본적인 문자열 관련 함수
함수 설명 |
_MBCS(멀티바이트) |
_UNICODE(유니코드) 정의됨 |
TCHAR 통합형(권장) |
문자열 복사 |
strcpy_s |
wcscpy_s |
_tcscpy_s |
문자열 복사 (길이 지정) | strncpy_s | _mbsnbcpy_s | _tcsncpy_s |
문자열 서식 |
sprintf_s sprintf |
swprintf_s swprintf |
_stprintf_s _stprintf |
문자열 비교 |
strcmp |
wcscmp |
_tcscmp |
문자열 길이 |
strlen |
wcslen |
_tcslen |
문자열 추가 |
strcat_s strcat |
wcscat_s wcscat |
_tcscat_s _tcscat |
문자 검색 |
strchr |
wcschr |
_tcschr |
문자열 검색 |
strstr |
wcsstr |
_tcsstr |
문자열 스트림 입력 |
scanf_s |
wscanf_s |
_tscanf_s |
- 문자열을 정수 또는 실수형으로 변환
함수 설명 |
_MBCS(멀티바이트) (_UNICODE 정의안됨) |
_UNICODE(유니코드) 정의됨 |
TCHAR 통합형(권장) |
문자열 정수(int) 변환 |
atoi |
_wtoi |
_ttoi |
문자열 정수(long) 변환 | atol | _wtol | _ttol |
문자열 정수(long long) 변환 | atoll | _wtoll | _ttoll |
문자열 실수(double) 변환 | atof | _wtof | _ttof |
- 파일입출력 관련
함수 설명 | _MBCS(멀티바이트) (_UNICODE 정의안됨) | _UNICODE(유니코드) 정의됨 | TCHAR 통합형(권장) |
파일 열기 | fopen_s | _wfopen_s | _tfopen_s |
파일 쓰기(스트림 출력) | fprintf_s | fwprintf_s | _ftprintf_s |
스트림에서 문자열 읽기 | fgets | fgetws | _fgetts |
|
|
|
'Programming' 카테고리의 다른 글
영문 윈도우에서 VisualStudio 한글이 깨질때 해결방법 (0) | 2019.12.17 |
---|---|
[C++] LNK2019 _GetAdaptersInfo@8 Error 관련 (0) | 2019.12.12 |
[Visual Studio] 정규식으로 찾기 및 바꾸기 (0) | 2019.11.04 |
[C++/MFC] 쓰레드에서 UI에 접근하는 가장 안전한 방법 (0) | 2019.08.20 |
[VS2015] Visual Studio 2015 Setup Project Unrecoverable build error 발생시 (0) | 2019.06.24 |