brunch

You can make anything
by writing

C.S.Lewis

by Andy Oct 12. 2020

한글을 표현하는 한글 인코딩

10월 9일, 한글날을 기념해서 인코딩에 대해 알아봤습니다.

어느 날 웹서핑을 하다 보면, 갑자기 글자가 이상하게 깨져보이는 걸 본 경험이 있을 거에요. 보통 이런 경우에는 '인코딩이 잘못되었다'라고 하는데요. 이런 현상은 왜 발생하는지 여러분은 알고 계신가요? 이건 세계 각국의 다양한 언어를 표현하는 컴퓨터 내부의 방식이 서로 달라서 발생하는 현상이에요.


보통 컴퓨터에서는 Character Set라고 부르는 문자 집합이 OS에 내장되어 있고, 이건 국제 표준으로 등록되어 관리되고 있습니다. 그런데, 특정 웹페이지에서 내용을 불러올 때, 잘못된 문자집합의 설정을 사용하게 되면 내용의 글자가 전부 깨져서 보이게 되는 현상이 발생하는 겁니다.


한글이 깨져 보이게 되면, 무슨 암호문을 해석해야하는 기분이 든다.



우리나라에서는 기본적으로 한글을 표현하기 위해서  EUC-KR과 유니코드라는 2가지 방식을 가장 많이 사용하고 있는데요. 한 가지 방식으로 사용하면 될텐데, 왜 이렇게 다른 방식을 혼용해서 사용할까요?



초창기 컴퓨터에서는 문자를 표현할 필요가 없었습니다.


컴퓨터의 역사를 아는 분들이라면 ENIAC, EDVAC 이런 이름들의 컴퓨터를 들어보셨을 겁니다.

고대(?) 역사의 컴퓨터들은 1과 0의 조합을 이용해서 프로그래밍을 했고, 결과는 불빛으로 반짝여서 보여주거나 특정 신호를 별도로 해석해야만 하는 구조를 가지고 있었습니다. 특히, 인간의 언어 체계로는 이해하기 쉽지 않은 방식으로 계산이 이루어졌기 때문에 문자를 딱히 표현해야 할 필요가 없었습니다.


ALTARI 8800 조립식 컴퓨터로 결과를 불빛으로 보여주던 최초의 조립형 PC였다.


그러나, 점차 개발 언어들이 개발되기 시작하면서, 인간이 이해하기 쉬운 문자와 문법을 이용하는 프로그래밍 언어가 만들어졌고 문자를 컴퓨터 안에서 표현해야하는 필요가 생겨났죠. 그래서, 만들어진 문제 데이터를 서로 교환하기 위한 최초의 표준으로 만들어 진 것이 바로 ASC II (American Standard Code for Information Interchange)라는 인코딩 방법입니다. 이 방식은 영어에서 사용되는 A~Z까지의 문자에 일련번호를 붙여 이 번호에 대응하는 문자를 출력하거나 입력받는 방법을 사용했습니다. 그래서, 문자 체계의 용량도 무척 작았죠. 

이러한 인코딩 방식이 최초로 등장한 것이 바로 최초의 컴퓨터인 ENIAC이 등장하고 나서 15년도 넘게 지나서니까 문자를 컴퓨터 내부에 이해할 수 있도록 만드는 일이 쉽지는 않았다는 걸 알 수 있죠. 특히 ASC II 코드는 알파벳만 표현이 가능해서, 숫자와 특수 문자 등을 표기 하기 위해서 확장된 ASC II 코드가 만들어져서 총 255개의 문자를 표현하는 ISO-8859라는 국제 표준으로 정해지게 됩니다.


이미 눈치를 채셨겠지만, 알파벳 26글자에서 255글자까지 새로운 문자를 정의하게 된 아스키 코드의 역사에서 보셨죠? 문자 체계가 복잡할 수록 문자집합, 즉 인코딩 방식은 복잡해지고 정착하는데 오랜 시간이 걸리게 됩니다. 한글처럼 초/중/종성이 분리되어 무한대의 소리를 표현할 수 있는 언어는 그만큼 인코딩 방식을 설계하는 방법이 쉽지 않았으니까 말이죠.



한글 인코딩의 역사, 우리 말을 컴퓨터에 쓰고 읽을 수 있게 되다.


8비트 컴퓨터가 등장하면서 한글을 자소 단위로 표현하는 n바이트 조합형이라는 방식이 만들어졌는데요. 3바이트/2바이트 조합형 등으로 불리던 여러 방식의 조합형 인코딩이 있었습니다. 당시 삼성, 금성, 삼보 등의 여러 회사들이 컴퓨터를 판매하면서 각자 회사에서만 사용하는 조합형 폰트를 사용했는데요. 삼보 조합형 코드를 중심으로 통합이 되어갔습니다. 그런데, 윈도우가 등장하면서 한글 사용방식이 대거 바뀌게 됩니다. 바로 CP949라고 불리는 완성형 한글을 MS에서 채용했기 때문이죠. 2바이트로 1개의 글자를 표현하는 이 방식은 완성형 한글로 불리웠습니다. 그러나, 완성형 한글은 표현할 수 있는 문자의 개수 제한이 있었고, 확장 완성형이라고 덩치를 키운 이 인코딩 방식은 한글 문자체계에 대한 인식이 부족했던 MS가 시장을 장악하면서 어쩔 수 없이(?) 보편적으로 사용되게 됩니다. 윈도우98이 CP949 완성형을 도입한 이후, 조합형 한글은 완전히 시장에서 사라지게 됩니다. (초/중/종성을 조합해서 한글을 표현하는 것이 가장 효과적임에도 불구하고 말입니다.)


이러한 완성형 한글의 가장 큰 단점을 보여주는 사례가 바로 KSC 5601이라는 코드입니다. 당시 이 한글 인코딩 방식은 모든 한글로 표현할 수 있는 글자의 21% 밖에 표현하지 못하다보니 '똠방각하'라는 드라마를 'ㄸㅗㅁ방각하'라고 표현하거나, '펩시'를 '펲시'라고만 쓰게 되는 우스운 일이 발생하곤 했습니다. (이 사례는 한글 인코딩 문제의 대표적 사례로 아직도 인용되고 있습니다.) 즉, 한글을 한글대로 사용할 수 없는 문제가 계속 지적되었습니다. 그러다보니 완성형 한글로 통합되어 가는 과정에서 많은 한글 체계가 혼용되어 사용되었습니다.


예전에는 한글을 무슨 인코딩을 쓸 지 선택했어야 ㅠㅠ (출처 : http://pat.im)


MS가 8,822자를 추가한 CP949를 윈도우에 적용하고 시장을 통합하지 않았다면 아직도 한글 체계는 더욱 복잡하게 사용되고 있었을 겁니다. 최근에는 2,350글자를 표현가능한 EUC-KR, 11,172자를 표현 가능한 CP949가 대중적으로 많이 이용되고 있죠. 



전세계 공통의 코드, 유니코드로 한글을 표현해요.


유니코드는 전 세계에서 사용하는 모든 문자 집합을 하나로 모았다는 의미에서 Unicode라고 불립니다. 우리 한글은 유니코드 2.0 버전에서 한글 11,172자가 모두 포함되었는데요. 유니코드는 31비트의 문자집합이라서 거의 무한대에 가까운 문자 표현이 가까운 것이 특징입니다. 특히, 각 나라에서 사용하는 특수한 문자체계도 여러 영역으로 나누어 표현할 수 있는 장점이 있죠. 특히, 초/중/종성을 사용하는 한글의 자모와 소리 마디, 자모 확장을 서로 다른 영역에 배치함으로써 체계적인 한글 표현이 가능해졌습니다.

특히, 유니코드는 아래에서 보는 것처럼 현대 한글에서 표현할 수 없는 옛한글까지 표현할 수 있는 장점까지 갖추고 있습니다.


보통 그래서 우리가 사용하는 한글 유니코드 표현방식은 UTF-8이라는 방식입니다. 


그렇다면, 앞에서 얘기드린 대로 웹브라우저에서 한글이 깨져서 보이는 현상은 왜 발생하는 걸까요? 그건 브라우저의 인코딩 값 설정과 서버의 인코딩 값이 서로 다르기 때문입니다. 즉, 웹서버에서는 EUC-KR 방식으로 한글을 저장해두고 보여주는데, 웹 브라우저에서는 그것을 UTF-8 코드에 맞춰 해석해서 보여준다면 당연히 서로 다른 방식의 암호 해석을 하는 것처럼 글자가 깨져보이게 되는 것이죠.


그래서, 프로그래머들은 웹사이트를 개발하면서 'EUC-KR', 'UTF-8', 'ISO8859-1' 등의 여러 한글 인코딩 방식을 인지하여 보여줄 수 있도록 호환성을 확보하고 있습니다.


웹페이지에서 한글이 깨져보이는 페이지는 그래서 요즘은 찾기 힘들죠. 그렇지만, 한글이 깨져보일 때 "인코딩이 깨져서 그러는거야"라고 이제 여러분도 아는 척 하실 수 있겠죠?


한글날이 찾아오는 10월, 한글 인코딩의 역사에 대해 알아봤습니다.














브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari