티스토리 뷰

Programming Languages/C,C++

TEXT Encoding에 대하여.

sw편한세상 2011. 4. 23. 20:27

처음으로 텍스트를 이진수로 표현한 인코딩방식은 ASCII 코드 이다.
모든 텍스트가 1바이트로 해결이 돼었다. 프로그래밍의 주 무대가 영어권이기 때문에. 이러한 인코딩을 SBCS(single byte character set)이라고 한다.
그러다 점점 Computer science가 확장되고 컴퓨터를 사용하는 나라, 언어가 많아지면서 많은 언어를 1바이트로는 담을 수 없게 되었다.
그래서 나온게 모두 2바이트인 유니코드(Unicode)
하지만 알파벳은 1바이트로 담을 수 있는데 굳이 2바이트로 해야겠느냐.. 라는 것 때문에 알파벳은 1바이트, 다른언어는 2바이트로 인코딩하게 된 방식을 멀티바이트(MultiByte Character Set)라 하여 등장하게 되었다.
 하지만 컴퓨터산업이 발전해 메모리 걱정을 더이상하지 않아도 될 때 다시 유니코드가 등장했고 그에 맞추어 C 표준 인코딩도 바뀌었다.

처음엔 char*, "text", strlen ... 등 우리가 일반적으로 사용하듯 멀티바이트형식의 텍스트를 사용했지만, 유니코드가 활성화 되면서 wchar_t라는 것이 생겨났다.
이것은 기존의 멀티바이트와 차별화해야했으므로 wchar_t *, L"text", wcslen...  등으로 형식이 바뀌었다. 이것이 유니코드의 집합인데 이것은 국제표준이기 때문에 Windows, Linux, MacOS등 C를 사용한 랭귀지에는 모두 사용이 가능하다.

여기에 MS에서는 이것들의 호환성을 맞추기 위해 자신만의 매크로를 설정하게 되었다. 간단한 예제를 살펴보면 다음과 같다.

#define UNICODE

#ifdef UNICODE
	typedef wchar_t TCHAR;
	#define _TEXT(x) L##x
	#define _T(x) _TEXT(x)
	#define _tcslen wcslen
#else
	typedef char TCHAR;
	#define _TEXT(x) x
	#define _T(x) _TEXT(x)
	#define _tcslen strlen
#endif

int main(){

	TCHAR s[] = _T("ABCD가나다라");
	int n = _tcslen(s);
	printf("%d\n", n);

}


다음과 같이 설정되어 있는데, TCHAR, _T("text"), _tcslen... 등으로 사용하도록 되어 있다.
이것은 UNICODE라는 것이 전처리기에 매크로 되어 있으면 TCHAR를 wchar_t로 변환해서 사용할 것이며, 그것이 아니면 char로 사용하겠다는 의미이다.

 알게 됐으니 앞으로 자주 사용하도록 하자.

다시 정리하면 다음과 같다.
// 모든 글자가 1byte : SBCS (single byte character set)
// 모든 글자가 2B : 유니코드
// 영어는 1B, 한 2B : MultiByte Character Set

//               DBCS      UNICODE      MS_Macro
// 타입 :         char      wchar_t       TCHAR
// 문자열 :        " "         L" "      _T(" ")
// 문자열 함수 :    strxx()    wcsxx()     _tcsxxx()

댓글
03-29 20:24
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday