http://www.jinsuk.pe.kr 유니코드(Unicode)와 유니코드 인코딩 원래 유니코드에 관한 개괄적인 내용을 담은 문서는 만들지 않을 작정이었습니다. 그런데, 유니코드를 처리하는 부분에 대한 작업을 진행하다보니 용어나 인코딩 방식 등에 대해 혼동이 되는 부분이 너무 많군요. 제 자신을 위해서도 유니코드에 대한 정리를 할 필요가 있을 듯하여 이 문서를 작성합니다. 이 문서에서는 유니코드의 기본 구성 및 인코딩 방식에 대해 비교적 자세하게 설명할 것입니다. 성격 급하신 분이라면 Unicode Consortium이 제공하는 코드간 변환 소스(C 언어)를 바로 보시는 게 더 도움이 될 수도 있겠군요 :-) 차례 - 유니코드 야사 (아마도 이랬을 것입니다)
- 유니코드의 구조
- 유니코드 3.1에 정의된 언어 영역
- 유니코드 용어의 이해
- 유니코드 인코딩
- UTF-8 인코딩 (8 비트)
- UTF-16 인코딩 (16 비트)
- UTF-32 인코딩 (32 비트)
- 보충언어판에 대한 UTF-32와 UTF-16의 인코딩
- UTF-16과 UTF-8의 대행코드 인코딩에 관한 오해
- 기타
- 참고문헌
유니코드 야사 (아마도 이랬을 것입니다) 거의 모든 프로그래밍 언어에서 사용하는 데이타 기본형으로 char가 있습니다. 이것이 8개의 비트, 즉 1바이트로 이루어져 있다는 것은 모두 알고 계시죠? 왜 하필 8비트였을까요? 당시의 메모리 사용환경이라던지(지금에 비하면 무지무지하게 열악했을 겁니다), CPU 연산속도 때문이라던지(애니악의 경우 폰노이만보다 계산속도가 느렸다는 이야기가 있습니다) 이런 이유들 때문이었을 까요? 가장 궁극적인 원인은 컴퓨터를 만든 사람들에게 있어서 8비트(실제로는 7비트)면 자신들의 언어(영어)를 모두 표현할 수 있었다는 데 있을 것입니다. 즉 7비트이면 27(128)개의 코드를 표현할 수 있는데, 26x2(알파벳 대소문자) + 10(숫자) + 특수문자 + 통제문자 등등을 모두 합쳐 128개이하로 표현이 가능합니다. 세상 모든 사람들이 영어만 쓴다면 Unicode를 만들겠다는 생각을 아무도 하지는 않을 것입니다(훗날 외계인들의 언어를 수용한다면 모를까...). 1바이트로 모든 문자를 표현할 수 없는 언어를 사용하는 국가에서는 각각 자신들만의 인코딩 방법으로 이용하여 문자를 표현해 왔습니다. 한국의 경우 KSC5601 표준(완성형)이 대표적이죠. 그러다 보니 한글, 한자, 일본어 등을 섞어쓸 수 있는 방법이 묘연했었나 봅니다(제한적이나마 가능하긴 합니다만). 그래서 소프트웨어 업체들이 생각한 것이 "그러면 세계의 모든 문자를 표현할 수 있는 코드 체계를 만들자!"라고 해서 만들어지기 시작한 게 UniCode입니다. 세상에 존재하는 모든 문자의 수가 216(65,536)개 이하라면 어떻게 될까요? char를 16비트로 증가시키면 간단하게 해결되겠죠? 처음에는 다들 그렇게 생각했나 봅니다. 유럽과 같이 영어 알파벳 쓰는 자잘한 언어들의 경우 몇백자면 될테고, 한글도 1만자 조금 넘고, 한자도 2만자 조금 넘게 주면 될 것 같고... 모두 합쳐도 6만자도 안되겠네... 그랬나 봅니다. 그래서 유니코드는 16비트의 공간에 모든 문자를 집어넣으려고 했습니다. 이 16비트 영역을 기본다중언어판(BMP, Basic Multilingual Plane)이라고 부릅니다. Unicode 3.0버전까지는 여기에만 문자 코드가 부여되어 있었습니다. 세상일이란 그렇게 만만치 않죠... 한중일에서 고문서를 다루는 사람들도 컴퓨터를 사용해야 되지 않겠습니까? 우리말 고어는 어떻게 표현하고, 지금은 사용되지 않는 옛 한자는 또 어떻게 하란 말입니까? 새로운 인코딩 방식을 별도로 만들어서 사용할까요? 이렇게 되면 유니코드라는 게 의미가 없어질 것입니다. 그래서 유니코드 3.0부터 보충언어판(Supplementary Planes)을 정의하였습니다. 이를 위해 BMP의 2,048자를 대행코드 영역(Surrogates)으로 할당하고 이중 1,024자를 상위대행(high surrogates), 1,024자를 하위대행(low surrogates)으로 정의하여 이 둘의 조합으로 다시 1백만여자의 - 1024x1024=1048576 - 문자를 추가로 정의할 수 있도록 하였습니다. 유니코드 3.1부터는 실제로 이 영역에 문자를 정의했습니다. 가장 크게 할당 받은 것은 역시 한자로 4만여자가 추가로 정의되었습니다. 이러한 세계표준코드를 만들려는 움직임은 소프트웨어 업체들의 연합인 유니코드 컨소시엄외에도 있었습니다. 세계표준기구(ISO)가 바로 이 움직임의 주체였는데, 다행스럽게도 두 단체가 서로 합의하여 1991년이후로 동일한 표준을 만들고 있습니다. 유니코드 표준과 동일한 세계표준기구의 표준안은 ISO/IEC 10646으로 명명되었습니다. 두 표준이 내용은 동일하지만 사용하는 용어나 논리적인 설명이 약간 다르기 때문에 혼동스러울 때도 있습니다. 이러한 이유때문에 제가 이 문서를 작성한 것입니다 :-) |