인코딩 디코딩. 굳이 개발자가 아니더라도 들어봤을만한 이야기들입니다.
자주 듣지만 아주 자세히는 알지 못하는 부분이 많은 내용이라 생각이들어 정리해보고자 합니다.
우선 오해할 수 있는 부분인 '문자 코드' 와 '문자 인코딩'을 구분하고 가려고합니다.
우리가 흔히 사용하는 ASCII , UNICODE, EBCDIC 는 모두 '문자 코드'인 것이죠.
문자 코드는 문자를 나타내기 위해 사용되는 숫자값이며, 문자 인코딩은 문자 코드를 실제 데이터로 변환하는 규칙을 나타냅니다. 문자 코드는 추상적인 개념이고, 문자 인코딩은 문자 코드를 실제로 표현하고 전송하기 위한 방법을 제공합니다.
ASCII
초창기의 컴퓨터는 사람과 기계어로만 소통을 했었고, 당연히 사용 과정에 상당한 애로사항을 겪었다. 그래서 어셈블리어 등의 사람이 쓰는 문자를 사용할 필요성이 생겼기 때문에, 라틴 문자와 숫자, 몇몇 특수문자를 128개(2^7)의 코드값에 1:1 대응시키는 법을 고안했고, 이것이 바로 최초의 문자 코드라고 할 수 있는 ASCII(American Standard Code for Information Interchange)다.
아스키는 곧 7비트로 이루어졌고, 1바이트 단위로 통신할 때 나머지 1비트는 패리티 코드로 쓰게 되어 있었다. 아스키는 이름에서 나오듯이 근본적으로 정보 교환을 위한 규격이었고, 통신 에러를 감지하기 위한 체크섬이 필요했기 때문이었다. 그러나 이런 간단한 체크섬은 얼마든지 회피할 수 있는 에러들이 발생할 수 있었고, 그래서 이런 패리티 코드는 곧 쓰이지 않게 되었다. 컴퓨터가 8비트=1바이트를 사용하게 되자 대부분의 컴퓨터 업체들은 아스키코드의 7비트 맨 앞에 0비트를 써서 8비트를 채운 인코딩을 쓰게 되었다.
ASCII의 이름에서 볼 수 있듯 미국에서 만들어졌는데, 미국에서 쓰이는 영어를 쓰기 적합한 형태로 만들어졌다. 영어에서 쓰이는 라틴 문자는 diacritics가 없다시피 하기 때문에 넣기가 쉬웠던 것.
하지만 당장 라틴 문자를 공유하는 유럽쪽언어와, 한자, 한글, 가나, 아랍어따위의, 영어를 제외한 나머지 언어나 글자는 사용할 수 없었다. 그래서 8비트 아스키부호화에서 비어있는 127뒤의 빈 자리를 다양한 글자로 채워넣는 부호화들이 등장했는데, 표준이 아니었으므로 회사마다 모두 다른 글자를 할당했고, 또 각국이 자국어표기를 위해 이 공간을 활용하면서 표준화의 지옥문이 열렸다.
UNICODE
유니코드(Unicode)는 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식이다. 유니코드 컨소시엄(Unicode Consortium)에서 제정, 관리한다.
주요 구성 요소는 ISO/IEC 10646 Universal Character Set과 UCS, UTF 등의 인코딩 방식, 문자 처리 알고리즘 등이다. 전 세계의 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자 체계에 따른 충돌 문제를 해결하였다. 따라서 유니코드를 사용하면 한글과 신자체·간체자, 아랍 문자 등을 통일된 환경에서 사용할 수 있다.
초창기에는 문자 코드는 ASCII의 로마자 위주 코드였고, 1바이트의 남은 공간에 각 나라가 자국 문자를 할당하였다. 하지만 이런 상황에서 다른 국가에 이메일을 보냈더니 글자가 와장창 깨졌던 것. 인터넷 웹페이지도 마찬가지였다. 이에 따라 4바이트(32비트, 약 42억 자)의 넉넉한 공간에 세상의 모든 문자를 할당한 결과물이 이것이다.
현재의 유니코드는 지구상에서 통용되는 대부분의 문자들을 담고 있다. 여기에는 언어를 표기할 때 쓰는 문자는 물론, 악보 기호, 이모지, 태그, 마작이나 도미노 기호 같은 것들도 포함된다.
모든 문자 체계를 담고 있는 것은 아니라서, 과거에 사용된 문자 체계나 쓰임이 적은 인공문자,[1] 자료가 많이 남아 있지 않은 문자 체계는 등록이 되어있지 않아 유니코드로 표현할 수 없다. 물론 아직 유니코드에 없다 뿐이지 어지간한 문자 체계는 유니코드에 집어 넣으려는 계획이 진행중이다. 앞으로 유니코드에 뭘 넣을지 보여 주는 로드맵[2]이 있는데 꽤 알차게 차 있다. 선형문자 A는 해독도 안 되었는데 들어가 있다 물론 빈 공간도 꽤 있어 앞으로 유니코드 공간이 부족한 일이 생기려면 한참 남았다. 17개의 플레인 중에 현재는 7개만 사용되고 10개는 아직 사용되지 않고 있다. 공실률(?)로 치면 60%에 육박하는, 말 그대로 반 이상이 현재 미할당이다.
UTF-8 (Unicode Transformation Format 8-bit):
UTF-8은 가장 일반적으로 사용되는 유니코드(Unicode) 인코딩 방식입니다.
가변 길이 인코딩 방식으로, 영문 알파벳은 1바이트로 표현되고, 다국어 문자는 1~4바이트로 표현됩니다.
ASCII 문자와의 하위 호환성을 유지하면서 모든 유니코드 문자를 표현할 수 있습니다.
UTF-16 (Unicode Transformation Format 16-bit):
UTF-16은 유니코드 문자를 16비트로 인코딩하는 방식입니다.
영문 알파벳은 2바이트로 표현되고, 일부 언어의 문자는 2바이트 이상으로 표현됩니다.
BMP(기본 다국어 평면)의 문자는 2바이트로 표현되며, 나머지 문자는 대체 쌍(서로 다른 2개의 2바이트 유니코드)으로 표현됩니다.
ISO-8859-1 (Latin-1):
ISO-8859-1은 서유럽 언어를 포함한 Latin-1 문자 집합을 표현하는 인코딩 방식입니다.
1바이트로 모든 문자를 표현하며, 영문 알파벳, 숫자, 특수 문자, 서유럽 언어의 문자 등을 포함합니다.
다른 ISO-8859 시리즈도 있으며, 각각은 특정 언어나 문자 집합을 대상으로 합니다.
UTF-32 (Unicode Transformation Format 32-bit):
UTF-32는 유니코드 문자를 32비트로 인코딩하는 방식입니다.
모든 문자가 4바이트로 표현되어 고정 길이 인코딩을 제공합니다.
모든 유니코드 문자를 표현할 수 있지만, 저장 공간을 많이 차지하므로 일반적으로 사용되지는 않습니다.
CP949 (Code Page 949):
CP949는 한국어를 포함한 동아시아 언어를 위한 문자 인코딩 방식입니다.
1바이트와 2바이트로 문자를 표현하며, 한글 음절은 2바이트로 표현됩니다.
EUC-KR과 호환성을 가지고 있습니다.
ANSI(American National Standard Institute) :
ANSI는 8bit로 구성되어 있으며 256개의 문자를 표현할 수 있는 인코딩 방식입니다.
ANSI는 ASCII의 확장판으로 이해하면 되는데 그 이유는 ASCII에서 1bit를 더 사용한 것이기 때문입니다.
"ANSI"라는 용어는 문자 인코딩에 관련해서는 다소 혼동을 초래할 수 있습니다. 특히 Microsoft Windows 환경에서 "ANSI"는 주로 기본적인 1바이트 문자 인코딩을 가리킵니다. 이는 주로 로마 알파벳 문자와 몇 가지 특수 문자를 지원하는 인코딩 방식입니다. Windows의 "ANSI"는 실제로는 다양한 문자 인코딩 방식 중 하나를 의미하며, 주로 현재 사용되는 인코딩 방식에 따라 다를 수 있습니다. 일반적으로는 Windows-1252 인코딩이 "ANSI"로 알려져 있지만, 다른 지역 설정에서는 Windows-1251, Windows-874, Windows-932 등의 인코딩 방식을 "ANSI"로 사용하기도 합니다.
이 외에도 EUC-KR 이나 WINDOWS-949 와 같이 한국어 인코딩의 표준인 인코딩 방식들도 있습니다. 실제 비슷한듯 다른점들이 있으니, 특수문자와 같은 기형문자를 사용할때에는 byte계산에 유의해야한다 !
바이너리 데이터 인코딩:
URL 인코딩 :
Hex 인코딩 :
마크업 언어 인코딩 (Markup Language Encoding):