지난 시간에 0과 1로 숫자를 표현하는 방법에 이어서 문자를 표현하는 방법에 대해서 알아보겠습니다.
0과 1로 문자를 표현하는 방법을 알아보기 전 알아야 할 개념이 있습니다.
컴퓨터는 어떤 정해진 문자집합에 존재하는 문자를 이해할 수 있는 구조입니다. 반대로 문자집합에 존재하지 않는다면 컴퓨터는 이해할 수가 없습니다.
초창기 대표적인 문자 집합은 아스키코드입니다. 아스키코드는 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자를 표현할 수 있으며 아스키코드의 문자는 7bit로 표현할 수 있습니다. 아스키코드 하나의 문자를 7bit로 표현할 수 있다는 말은 아스키코드는 개, 즉 128개의 문자를 표현할 수 있습니다. 첨언으로 실제로 아스키코드는 8bit로 표현되지만 1bit는 오류 검출을 위해 사용되는 패트리 bit로 사용됩니다.
총 128개의 문자와 그에 부여된 값(코드포인트)로 이루어져 있으며 위의 표에 제시된 진법을 이진법으로 변환하여 0과 1로 표현할 수 있습니다.
한눈에 봐도 알 수 있듯이 아스키코드의 단점은 한글을 포함한 다양한 언어, 특수 문자 등을 표현할 수 없습니다. 그래서 등장한 것이 언어별 인코딩 방식입니다.
한글 인코딩 방식을 알아보기 전 한글의 특징을 알고 가면 더욱 도움이 됩니다.
한글은 영어와 달리 초성, 중성, 종성의 조합으로 이루어져 문자가 만들어지는 특징을 가집니다.
따라서 이런 특징을 어떻게 0과 1로 표현할 것인가에 대해서 완성형 인코딩 방식과 조합형 인코딩 방식이 존재합니다.
완성형 인코딩 방식은 김 이라는 단어에 고유의 코드를 부여하는 방식을 말하고 조합형 인코딩은 ㄱ+ㅣ+ㅁ 각각에 고유 코드를 부여하여 조합하는 방식입니다.
EUC-KR 인코딩 방식은 완성형 인코딩 방식으로 글자 하나에 2byte 크기의 코드를 부여하여 표현합니다. 즉 EUC-KR로 한글을 표현하기 위해서는 16자리의 이진수, 4자리의 십육진수로 표현할 수 있습니다.
EUC-KR 영어와 한자, 일어를 포함하고 한글은 약 2350여개를 표현할 수 있습니다. 하지만 쀏, 뙠과 같은 한글을 표현할 수 없다는 점과 국가마다 언어별로 인코딩을 하게 되면 다국어를 지원하는 프로그램을 개발할 때, 언어별 인코딩 방식을 모두 이해하고 포함시켜야 하는 단점이 존재합니다.
따라서 모든 언어, 특수문자까지 포함할 수 있는 문자 집합을 사용하자는 요구에서 생겨난게 유니코드 문자 집합과 UTF-8인코딩 방식입니다.
유니코드는 한글, 영어 뿐만 아니라 특수 문자, 이모티콘까지 통일된 문자 집합입니다. 이 유니코드의 문자집합을 인코딩 방식이 UTF-8입니다. 유니코드 문자 집합의 인코딩 방식은 UTF-8이외에도 UTF-16, UTF-32등이 존재합니다.
유니코드 문자집합에 속하는 문자들에는 U+2198처럼 고유 코드포인트가 존재합니다. 여기서 U+는 유니코드라는 의미와 16진수라는 의미를 가지고 있습니다. EUC-KR처럼 이 코드포인트를 그대로 문자 인코딩 값으로 삼지 않고, 다양한 방식으로 0과 1로 바꾸어 컴퓨터가 이해할 수 있는 형태로 변환하게 되는데 이게 유니코드 인코딩 방식(UTF-8, 16, 32...)입니다.
예를 들어 한 이라는 한글은 유니코드 문자집합에 D55C라는 16진수로 표현되어 있습니다. 여기서 이 코드포인트로 그대로 사용하지 않고 다양한 방법으로 0과 1로 변환하게 됩니다.
유니코드 인코딩 방식 중 가장 대중적인 방법은 UTF-8입니다.
UTF-8은 가변 길이 인코딩 방식인데 이 말은 인코딩 결과가 1byte~4byte사이에서 가변적인 길이로 인코딩 될 수 있습니다.
위의 범위에 따라 한의 D55C는 3byte로 표현될 수 있습니다.
정리하자면 UTF-8은 유니코드를 가변 길이로 인코딩할 수 있는 한가지 방법으로 길이를 결정하는 것은 유니코드의 코드포인트의 범위에 따라 1~4byte로 표현될 수 있습니다.
글을 마치기 앞서 앞으로 글자가 깨지게 된다면 혹시 문자집합에 포함되지 않는 문자를 사용한것은 아닌지 인코딩이 호환되지 않는지 분석해볼 수 있도록 도움되는 내용이었습니다.