반응형

윈도우 환경의 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 정의안됨)

 _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

 

 

 




반응형

ANSI

미국 국립 표준 협회(American National Standards Institute, ANSI)

미국의 산업 표준을 제정하는 민간단체.

ANSI에서 제정된 표준을 ANSI라고 부르기도 한다.



ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.



ASCII 코드 ( 아스키 코드 )

ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)

ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.


미국에서 표준화한 정보교환용 7비트 부호체계.

000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용된다.

영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있는 부호 체계.


장점 : 매우 단순하고 간단하기 때문에 어느 시스템에서도 적용가능하다는 장점

단점 : 2바이트 이상의 코드를 표현할 수 없다. (예 - 한글, 일어)


아스키코드는 모든 문자 크기가 1byte. 영어 외에 표현 어려움.






문자집합 크게 2가지

1. 멀티바이트 문자 집합

2. 유니코드 문자 집합






1. 멀티바이트 문자 집합


아스키코드 ( 1 byte  ) + 다른 문자 ( 2 byte ) 등을 포함한 문자 집합

한 문자 크기가 2 byte이기도 하고 그 이상이기도 하다. ( 영어로 사용될 땐 1바이트 )

문자마다 그때그때 달라요~



특정 문자 집합마다 코드 페이지가 존재한다.

같은 코드번호를 한글 코드 페이지로 해석하면 한글이 나오지만, 일어로 해석하면 일어가 나온다.

이상하게 깨지는 문자들은 멀티바이트 문자 집합이다!






2. 유니코드 문자 집합


아스키 코드 문자를 포함한 거의 모든 문자를 표현

한 문자 크기 2 byte 할당

각각 의 특정 문자는 고유의 유니코드 값을 가진다.







문자열 처리하는 기본 자료형

char, wchar, TCHAR





 

 char

 wchar 

 TCHAR 

 문자 크기

 1 byte

2 byte 

 설정에 따라 컴파일 시에 

 char 이기도 하고 wchar 이기도 하다.

 타입

 ASCII

 UNOCODE

 프로젝트 디버깅 설정에 따라 

 char (ASCII) 인지, 

 wchar (UNICODE) 인지 결정된다.

 

 

 

 

 

 

 

 

음 표가 가운데로 안와....ㅋㅋㅋ








wchar_t


음, 근데 난 wchar_t 찾는중이었다. 더 정리해 봅시다!


참고하는 중 : http://sonhy1.tistory.com/112


댓글이 굿


1 人 : wchar_t 데이터타입은 명백히 UTF-16 으로 인코딩되는 문자열을 다룰때 사용됩니다.


2 人 : whar_t를 C/C++ 표준 상에는 어떻게 다룰지 정해져 있지 않습니다. 

심지어, 최소 단위가 8bit 입니다.

이를 어떻게 다룰지는 compiler-specific 입니다. (컴파일러마다 다름!)

즉, wchar_t가 UTF-16으로 정의된건, MSVC에서만입니다.

wchar_t는 C 표준에 존재하며, (당연히 MS에서 만든게 아닙니다) 이를 MS에서는 UTF-16 형식을 담는 unsigned short로 구현하고 있을 뿐입니다.



-> 보다보니, utf-8 16 32 , UCS-2 어쩌구저쩌꾸하는데 눈이 @@ 팽글팽글 ㅋㅋㅋ




utf-8 과 utf-16 비교


참고하는 중 : http://pickykang.tistory.com/13


UTF-8과 UTF-16은 Unicode를 표현하는 Encoding 방식이다.


UTF-8과 UTF-16의 기본 차이는 문자 하나를 표현할 때 사용할 최소 byte를 의미한다고 볼 수 있다. 


UTF-8로 문자를 표현할 때 1~4bytes만큼 필요하다.

UTF-16은 2bytes(16bit), 4bytes 만큼 필요하다. 


두 Encoding 방식의 큰 차이는 최소 8bit가 필요하다 16bit가 필요하냐에 따라 다른 것이다. 


최적의 상황(저쟝, 통신 용량을 아껴야할 때)이 필요하다면, 어떤 CodePoint를 주로 사용하냐에 따라 UTF-8 또는 UTF-16을 선택하는 기준이 달라질 것이다.








참조 : 


http://klkl0.tistory.com/87


https://namu.wiki/w/ANSI


https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C?from=ASCII


http://blog.naver.com/wondo21c/30043174174





출처: http://juheel.tistory.com/7 [JDevelop]

반응형

C#에서는 FILE 핸들러로 바로 확인이 가능한데 C++는 한줄에 쓰기 번거러워 따로 함수를 만들어서 사용한다.


유니코드가 아닌 프로젝트도 있어 분기처리 해준다.



bool isExistFile(CString _strFile)
{
#ifdef _UNICODE
	return(_waccess_s(_strFile, 0) != -1);
#else
	return (_access_s(_strFile, 0) != -1);
#endif
	
}


+ Recent posts