CS

문자 집합(Character Set)

춤추는수달 2022. 7. 4. 23:56

문자 집합이란?

이진 정보를 특정 문자로 변환(해석)할 때, 그 기준이 되는 표를 의미한다. 대표적으로 가장 초기에 만들어진  'ASCII table'가 있다. 

ASCII table

컴퓨터는 0과 1로 이루어진 데이터를 문자로 해석하기 위해 이 표를 적절히 참고한다. 예를 들어 '0x43 0x44' 라는 이진 정보가 있을 때, 컴퓨터가 이 것을 ASCII table 문자 집합을 이용하여 문자열로 해석하면 'CD' 가 된다. 

환경에 따라 ASCII table가 아닌 다른 문자 집합을 사용할 수도 있다. 다른 문자 집합의 예로는 현재 가장 널리 쓰이는 'Unicode', 한국 산업 규격으로 지정된 'KS X 1001' 등이 있다. 


Unicode

Unicode는 현재 가장 널리 쓰이는 문자 집합이다. 어떤 구성인지 알아보자. 

유니코드는 ASCII 코드가 영어만 표현가능하다는 단점을 보완했다. 거의 모든 나라의 모든 언어를 표현할 수 있다. 물론 한글도 포함되어있다.

Unicode 일부

때문에 1byte로도 영어를 표현하는데 충분했던 ASCII 코드와 달리, Unicode는 모든 문자를 표현하기 위해 2byte '정도'는 필요하다. 여기서 '정도' 라고 표현한 이유는 3byte가 필요한 잘 안쓰이는 문자들도 포함되어 있고, 인코딩 방법에 따라 달라질 수 있기 때문이다.

 

참고)

Unicode에서 2byte로 표현할 수 있는 부분을 BMP(다국어 기본 평면)이라고 하고, 그 외에는 최소 3byte가 필요하다.

참고 2)

Unicode의 중요한 특징은 0~127번 까지는 위에 설명한 ASCII 코드와 동일하다는 점이다. 즉 Unicode를 사용한다고 해도, ASCII 코드처럼 1byte만 있으면 모든 영어 문자를 표현할 수 있다. (물론 한글은 최소 2byte가 필요하다.) 이를 이용해 공간을 절약하는 인코딩 기법도 있다. 


인코딩(Encoding)

인코딩이란 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다.
(출처 위키백과)

즉 위에서 설명한 문자 집합을 참고해 이진 데이터를 문자로 치환하는 행위 혹은 문자를 이진 데이터로 치환하는 행위를 말한다. 

그런데 이 인코딩 방법에도 여러가지가 있다. 대표적인 인코딩 방법으로 UTF-8, UTF-16 이 있다. 이들은 Unicode를 사용한 인코딩 방법들이다. 

*UTF-8

UTF-8은 위에 Unicode를 설명하면서 잠깐 언급했었던 기법이다. 영어는 1byte만 사용하고, 나머지 문자들은 2byte이상을 사용하는 인코딩 방법이다. (한글은 3byte가 필요하다.)

구체적으로 설명하자면, 이진 데이터의 앞 부분이 어떤 모양이냐에 따라 다른 언어로 해석하는 방법이다. 예를 들어 데이터의 맨 앞 bit가 '0' 이라면 해당 byte는 영어 문자(0번~127번 사이) 로 해석하는 식이다. 한글은 2048번~65535번 사이에 존재하므로 3byte가 필요하다.

따라서 만약 영어를 압도적으로 많이 사용하는 상황이라면 UTF-8 인코딩을 선택하는 것이 현명할 것이다. 

 

*UTF-16

UTF-16은 그냥 Unicode를 그대로 해석하는 방법이다. 따라서 영어도 2byte, 그 외에 문자들도 2byte가 필요하다. (BMP 밖의 문자들은 4byte가 필요하다.) 때문에 통신 시에도 영어, 한글 호환성이 훌륭하고, 항상 2byte를 사용하기 때문에 공간 계산이 편하다.

한글 비중이 많은 상황이라면 UTF-8보다 UTF-16이 좋은 선택이 될 수 있다.

 

*CP949

CP949는 마이크로소프트에서 채용한 인코딩 방식이다. 

간단히 설명하면 0~127까지는  'KS-X-1003 문자집합' (영어) 을 사용하고, 그 이상은 'KS-X-1001 문자집합' (한글은 여기 포함)을 사용한다. 

따라서 영어는 1byte가 필요하고, 나머지(한글 포함)은 2byte가 필요하다.  그러나 KS-X-1001 은 Unicode 처럼 모든 문자를 포함하지 않으므로, 모든 언어와 호환되지 않는다는 단점이 있다.


MBCS vs WBCS

*MBCS(Multi Byte Character Set)

MBCS는 char를 사용한다. (C++ 언어)

개별 문자를 다수(한 개 이상)의 바이트로 표현하는 문자 집합 (또는 인코딩)을 말한다.

UTF-8이 여기에 속한다. 

 

*WBCS(Wide Byte Character Set)

WBCS는 wchar를 사용한다. (C++ 언어)

개별 문자를 항상 2바이트로 표현하는 문자 집합  (또는 인코딩)을 말한다.

Windows 환경 기준으로 거의 UTF-16을 의미한다고 생각하면 된다.

 

참고)

위의 내용을 보고 알 수 있는 것은 char는 항상 1byte씩 해석하는 것이 아니고 , wchar는 항상 2byte크기를 가지고 2byte씩 해석한다는 것이다.


코드 실습

data1의 경우

data1

data2의 경우

data2

data3의 경우

data3

data4의 경우

이 경우에는 '_T'라는 것이 사용됐다. 이것은 환경에 따라 자동으로 UTF16(유니코드 환경) 혹은 UTF8(MBCS 환경)로  변환해주는 매크로이다. TCHAR는 그것을 받아주는 데이터 형이라고 보면 된다. 당시 나의 환경은 유니코드 환경이었으므로 data3과 동일한 결과가 나왔다.

data4