0과 1로 문자를 표현하는 방법에 알아보기 전에 반드시 알아야 할 세 가지 용어가 있다. 바로 문자 집합, 인코딩, 디코딩이다.
컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 문자 집합(character set)이라고 한다. 컴퓨터는 문자 집합에 속해 있는 문자를 이해할 수 있고, 반대로 문자 집합에 속해 있지 않은 문자는 이해할 수 없다.
문자 집합에 속한 문자라고 해서 컴퓨터가 그대로 이해할 수 있는 것은 아니다. 문자를 0과 1로 변환해야 비로소 컴퓨터가 이해할 수 있다. 이 변환 과정을 문자 인코딩(character encoding)이라고 한다.
아스키(ASCII: American Standard Code for Information Interchange)는 초창기 문자 집합 중 하나로, 영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자를 포함한다. 아스키 문자 집합에 속한 문자(이하 아스키 문자)들은 각각 7비트로 표현되는데, 7비트로 표현할 수 있는 정보의 가짓수는 $2^7$개로, 총 128개의 문자를 표현할 수 있다.
위의 표를 보면 알 수 있듯 아스키 문자들은 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수에 일대일로 대응된다. 아스키 문자에 대응된 고유한 수를 아스키 코드라고 한다. 예를 들어 ‘A’는 십진수 65(이진수 $1000001_{(2)}$)로 인코딩되고, ‘a’는 십진수 97(이진수 $1100001_{(2)}$) 로 인코딩된다.
이렇듯 아스키 코드는 매우 간단하게 인코딩된다는 장점이 있지만 단점도 있다. 바로 한글뿐만 아니라 아스키 문자 집합 외에 문자, 특수문자를 표현할 수 없다는 것이다. 훗날 더 다양한 문자 표현을 위해 아스키 코드에 1비트를 추가한 8비트의 확장 아스키(Extended ASCII)가 등장하기도 했지만, 그럼에도 표현 가능한 문자의 수는 256개여서 턱없이 부족했다.
그래서 한국을 포함한 영어권 외에 나라들은 자신들의 언어를 0과 1로 표현할 수 있는 고유한 문자 집합과 인코딩 방식이 필요하다고 생각했다. 이런 이유로 등장한 한글 인코딩 방식이 바로 EUC-KR이다.
<aside> 🗒️ 아스키 문자는 8비트?
실제로는 하나의 아스키 문자를 나타내기 위해 8비트(1바이트)를 사용한다. 하지만 8비트 중 1비트는 패리티 비트(parity bit)라고 불리는, 오류 검출을 위해 사용되는 비트이기 떄문에 실질적으로 문자 표현을 위해 사용되는 비트는 7비트이다.
</aside>
알파벳을 쭉 이어 쓰면 단어가 되는 영어와 달리, 한글은 각 음절 하나하나가 초성, 중성, 종성의 조합으로 이루어져 있다. 그래서 한글 인코딩에는 두 가지 방식, 완성형(한글 완성형 인코딩)과 조합형(한글 조합형 인코딩)이 존재한다.
완성형 인코딩 방식은 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식이다.
반면 조합형 인코딩 방식은 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식이다.
EUC-KR은 KR X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩 방식이다. 즉, EUC-KR 인코딩은 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드를 부여한다.
EUC-KR 인코딩 방식으로 총 2,350개 정도의 한글 단어를 표현할 수 있지만 모든 한글을 표현할 수 있는 것은 아니다. 모든 한글을 표현할 수 없다는 사실은 때때로 크고 작은 문제를 유발 할 수 있는데 이러한 문제를 해결하기 위해 등장한 것이 마이크로소프트의 CP949이다. CP949는 EUC-KR의 확장 버전으로, EUC-KR로는 표현할 수 없는 더욱 다양한 문자를 표현할 수 있다. 다만, 이마저도 한글 전체를 표현하기에는 넉넉하지 않다.