728x90

문자셋 집합(문자셋)

데이터는 2진수 형태 숫자일 뿐 이것을 어떻게 해석할지는 다른 얘기.

이런 숫자 데이터를 인간의 글자 체계로 해석하기 위해 문자셋이 등장한다. 숫자와 문자를 매핑한 테이블. 

처음에 ASCII 문자셋이 나왔으나 이걸로는 한국, 중국등 다른 나라의 모든 나라에 사용하기는 부족해서 각 나라마다 본인들 만의 문자셋을 쓰기 시작함. (한국은 KS X 1001) 이런 문제를 통합하기 위해 나온 것이 unicode 문자셋이다. unicode 문자셋은 많은 언어를 지원하기 때문에 2byte로 문자를 표현한다. 사용빈도가 낮은 문자들은 2byte 범위를 벗어 나기도 한다.(BMP)

 

그럼 유니코드 문자셋을 쓰기 위해서는 2byte를 사용하면 되는가?

그건 다른 문제다. 유니코드를 쓴다 하더라도 1byte 범위 내에서 있는 영어, 라틴계 문자들은 1byte로 충분히 표현 가능하다.  따라서 문자를 해석하기 위해 사용하는 테이블이 문자집합이고 이를 참조해서 어떻게 데이터를 관리(압축)(인코딩, 디코딩) 하는 것은 다르다.

 

인코딩 방식

UTF-8

unicode 문자 집합을 사용하는 인코딩 방식.

영문은 1바이트

한글은 3바이트로 처리.

 

UTF-16

unicode 문자 집합을 사용하는 인코딩 방식. BMP 전 까지는 2바이트, 그 다음은 4바이트.

영문은 2byte

한글은 2byte

 

CP949

KS-X-1003 문자집합, KS-X-1001 문자집합, 두개의 문자집합을 참조 하는 문자 집합. MS에서 도입.

 

MBCS Vs WBCS

MBCS(Multi Byte Character Set)

- char

- 개별 문자를 다수의 바이트로 표현한 문자 

 

WBCS(Wide Byte Character Set)

- wchar

- 유니코드 기반의 character set (windows 기준 = UTF-16)

- 운영체제에 따라 다르게 동작 하지만 windows에서는 whcar를 사용하게 되면 자동으로 utf16으로 처리하려고 함.

 

 

실습코드

	//아스키 코드 참조
	{
		char c1 = '가'; // 정상적으로 값을 인식하지 못합니다.
		char c2 = 'a'; // 정상적으로 아스키 코드 값이 들어감.

		cout << c1 << " " << c2 << endl;
	}

	// CP949 (한글 2byte, 로바 1byte)
	{
		char sendData1[1000] = "가"; // multibyte + 2byte
		char sendData2[1000] = "a"; // multibyte + 1byte
	}

	// UTF8 (한글3byte + 로바 1byte)
	{
		char sendData1[1000] = u8"가"; // multibyte + 3byte
		char sendData2[1000] = u8"a"; // multibyte + 1byte

	}

	// UTF16 (한글/로바 2byte)
	{
		wchar_t sendData1[1000] = L"가";  //widebyte + 2byte
		wchar_t sendData2[1000] = L"a"; // widebyte + 2byte
	}

	// CP949 or UTF16 (설정에 따라)
	{
		TCHAR sendData1[1000] = _T("가"); // 속성에서 multibyte로 하면 cp949가 적용, 유니코드 적용하면 utf16이 적용
		TCHAR sendData2[1000] = _T("a"); // 속성에서 multibyte로 하면 cp949가 적용, 유니코드 적용하면 utf16이 적용
	}

 

실습을 하다 보면 몇가지 사실을 알 수 있다.

- ' ' 기호는 아스키코드를 참조하도록 한다. 때문에 '가' 방식으로 한글을 표현할 수 없다.

- "" 는 cp949를, u8""은 utf8을, L""은 utf16로 인코딩한다.

- L""를 사용하면 utf16을 사용하면 wbcs을 사용하기 때문에 wchar_t을 사용해야 한다.

- visual studio의 포로젝트 세팅에서 유니코드 문자셋은 utf16을 의미한다. multibyte set은 cp949를 의미한다.

- multibyte set이라고 하면 여러가지 인코딩을 예로 들수 있지만 wbcs라고 하면 utf16 자체를 의미 하는 것 같다.

 

단순히 문자셋, 인코딩에 대한 개념을 이해하는 것은 어렵지 않으나, 의미를 굉장히 혼동하여 사용하는 것 같다.. 때문에 개념을 정확하게 이해하지 못하면 혼용되어 사용될 때 이해하기 난해한 경우가 있으니,  기본 개념을 정확히 이해하고 개발환경에서는 또 어떻게 혼용하는지 까지 이해할 필요가 있다.

 

 

 

728x90

+ Recent posts