[ETC.] UTF-8과 EUC-KR의 차이점에 대하여

보통 한글이 깨졌다고 하죠. 개발을 하다 보면 한글이 제대로 표현된 프로젝트를 import 시켰을 때 아래 그림처럼 한글이 깨지는 경험이 있으실 겁니다.

 

한글깨짐

 

대체 이런 상황은 왜 발생하는 것일까요? 그 이유는 컴퓨터에서 한글을 표현하는 다양한 문자열 셋과 인코딩 방식들이 맞지 않기 때문입니다.

 

컴퓨터가 문자를 읽는 방식

컴퓨터는 정보를 0과 1로만 이루어진 바이너리 숫자로 데이터를 저장합니다. 그렇다면 0과 1밖에 모르는 컴퓨터에서는 숫자나, 알파벳, 한글 등을 어떻게 표현할 수 있는 걸까요? 컴퓨터는 문자를 표현하기 위해서 우리가 사용하는 문자들과 대응하는 숫자를 매깁니다. 예를 들면 65 = 'A', 66 = 'B'처럼 말이죠. 이렇게 숫자와 대응되는 문자열 셋을 만들면 컴퓨터에서도 문자를 표현할 수 있습니다. 예를 들면 사람이 문자열을 입력하면 컴퓨터는 문자열 표를 본 뒤 컴퓨터는 그것을 이 바이너리 숫자로 저장하고 사람에게 다시 보여줄 때는 다시 바이너리 숫자를 문자열 표를 확인하여 해당 글자를 찾아서 텍스트로 보여주는 것입니다. 이 과정을 바로 문자 인코딩이라고 합니다. 

 

 EUC-KR 

가장 초창기에서 사용하는 문자열 표 아스키코드에는 미국에서 사용되는 숫자나, 알파벳만 들어있었기 때문에 한글과 같은 다른 문자 체계는 표현이 불가능했습니다. 그래서 나라들마다 문자열 표를 다 각각 만들었습니다. EUC-KR도 이때 탄생한 문자열 셋이며 아스키코드가 1byte였던 것과는 달리 2byte(16bit)으로 이루어져 있습니다.

EUC-KR

EUC-KR의 문자열 표는 위와 같습니다. 한글 '가'는 'b0 a 1'로 대응됩니다. EUC-KR 코드표에는 한글뿐만은 아니고 특수 기호, 영문, 한문, 일어 등이 함께 정의되어 있습니다. 하지만 이 EUC-KR도 문제가 많았습니다. 이렇게 각각의 나라마다 문자열 셋을 다 따로 만들게 되면 인코딩이 통일되지 않아서 문자가 깨지는 현상이 자주 발생하고 EUC-KR에는 정의되어 있지 않은 태국어와 같은 외국어는 표현할 수 없기 때문에 한글 + 태국어를 동시에 표현할 수가 없는 문제도 발생합니다. 이러한 문제들을 해결하기 위해서 전 세계 문자를 모두 하나로 통합한 문자열 셋을 만들었습니다. 그것이 바로 유니코드입니다. UTF-8이 이 유니코드에 해당합니다.

 

 UTF-8 

유니코드는 전세계 모든 문자를 이 유니코드에 하나로 합친 것으로 한글, 일본어, 중국어, 태국어 심지어는 이모티콘까지 표현이 가능해졌습니다.

유니코드

한글 유니코드의 문자열 표는 위와 같습니다. 한글 '가'는 'AC00'으로 대응됩니다. 유니코드 인코딩 방식에는 대표적으로 UTF-8, UTF-16, UTF-32등이 있고 이 중에서 ASCII와 호환이 가능하면서 가장 크기가 가벼운 UTF-8을 많이 사용합니다. 

 

코드 포인트 범위에 따른 UTF-8 인코딩 방식

코드 포인트 범위 비트 수 인코딩
U+0000~U+007F 7 그대로 인코딩
U+0080~U+07FF 11 110xxxxx 10xxxxxx
U+0800~U+FFFF 16 1110xxxx 10xxxxxx 10xxxxxx
U+10000~U+1FFFFF 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8은 유니코드 범위에 따라 1~4byte로 인코딩하는 가변 크기 인코딩 방식입니다. 사용빈도가 높은 글자는 적은 저장 공간을 차지하고 사용빈도가 낮은 글자는 많은 저장 공간을 차지하게 만들어졌습니다.

 

요즘 개발되는 프로젝트는 대체로 UTF-8을 사용합니다. 따라서 우리도 UTF-8을 사용하여 인코딩 문제가 생기지 않도록 방지하는 것이 좋겠습니다. 다만 UTF-8을 사용하면 용량이 다소 늘어나는 문제는 있습니다. EUC-KR에서는 한글 1자가 2byte이지만 UTF-8에서는 한글 1글자가 3byte이기 때문입니다.

댓글

Designed by JB FACTORY