인코딩이 뭘까 ?

HenryHong·2023년 5월 26일
0

인코딩 디코딩. 굳이 개발자가 아니더라도 들어봤을만한 이야기들입니다.
자주 듣지만 아주 자세히는 알지 못하는 부분이 많은 내용이라 생각이들어 정리해보고자 합니다.

우선 오해할 수 있는 부분인 '문자 코드' 와 '문자 인코딩'을 구분하고 가려고합니다.

우리가 흔히 사용하는 ASCII , UNICODE, EBCDIC 는 모두 '문자 코드'인 것이죠.

문자 코드(Character Code):

  • 문자 코드는 문자를 컴퓨터에서 표현하기 위해 할당된 고유한 숫자값입니다.
  • 문자 코드는 문자 집합(Character Set)을 정의하며, 각 문자에 대해 고유한 코드 포인트(Code Point)를 지정합니다.
  • 대표적인 문자 코드로는 ASCII, Unicode, EBCDIC 등이 있습니다.
  • 문자 코드는 문자에 대한 추상적인 개념이며, 어떤 문자에 어떤 코드 포인트가 할당되는지를 정의합니다.

문자 인코딩(Character Encoding):

  • 문자 인코딩은 문자 코드를 실제 데이터로 변환하는 방법을 나타냅니다.
  • 문자 인코딩은 문자 코드의 숫자값을 컴퓨터가 이해할 수 있는 이진 데이터(바이트 시퀀스)로 변환합니다.
  • 문자 인코딩은 문자를 바이트로 변환하고, 이진 데이터를 다시 문자로 디코딩할 수 있는 규칙을 제공합니다.
  • 대표적인 문자 인코딩 방식으로는 UTF-8, UTF-16, ISO-8859-1, CP949 등이 있습니다.
  • 문자 인코딩은 문자 코드를 실제로 저장하거나 전송하는 데 사용되며, 데이터의 인코딩 및 디코딩에 필요한 규칙을 정의합니다.

문자 코드는 문자를 나타내기 위해 사용되는 숫자값이며, 문자 인코딩은 문자 코드를 실제 데이터로 변환하는 규칙을 나타냅니다. 문자 코드는 추상적인 개념이고, 문자 인코딩은 문자 코드를 실제로 표현하고 전송하기 위한 방법을 제공합니다.

문자 코드의 종류

  1. 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뒤의 빈 자리를 다양한 글자로 채워넣는 부호화들이 등장했는데, 표준이 아니었으므로 회사마다 모두 다른 글자를 할당했고, 또 각국이 자국어표기를 위해 이 공간을 활용하면서 표준화의 지옥문이 열렸다.

  2. 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%에 육박하는, 말 그대로 반 이상이 현재 미할당이다.

문자 인코딩의 종류

  1. UTF-8 (Unicode Transformation Format 8-bit):

    UTF-8은 가장 일반적으로 사용되는 유니코드(Unicode) 인코딩 방식입니다.
    가변 길이 인코딩 방식으로, 영문 알파벳은 1바이트로 표현되고, 다국어 문자는 1~4바이트로 표현됩니다.
    ASCII 문자와의 하위 호환성을 유지하면서 모든 유니코드 문자를 표현할 수 있습니다.

  2. UTF-16 (Unicode Transformation Format 16-bit):
    UTF-16은 유니코드 문자를 16비트로 인코딩하는 방식입니다.
    영문 알파벳은 2바이트로 표현되고, 일부 언어의 문자는 2바이트 이상으로 표현됩니다.
    BMP(기본 다국어 평면)의 문자는 2바이트로 표현되며, 나머지 문자는 대체 쌍(서로 다른 2개의 2바이트 유니코드)으로 표현됩니다.

  3. ISO-8859-1 (Latin-1):
    ISO-8859-1은 서유럽 언어를 포함한 Latin-1 문자 집합을 표현하는 인코딩 방식입니다.
    1바이트로 모든 문자를 표현하며, 영문 알파벳, 숫자, 특수 문자, 서유럽 언어의 문자 등을 포함합니다.
    다른 ISO-8859 시리즈도 있으며, 각각은 특정 언어나 문자 집합을 대상으로 합니다.

  4. UTF-32 (Unicode Transformation Format 32-bit):
    UTF-32는 유니코드 문자를 32비트로 인코딩하는 방식입니다.
    모든 문자가 4바이트로 표현되어 고정 길이 인코딩을 제공합니다.
    모든 유니코드 문자를 표현할 수 있지만, 저장 공간을 많이 차지하므로 일반적으로 사용되지는 않습니다.

  5. CP949 (Code Page 949):
    CP949는 한국어를 포함한 동아시아 언어를 위한 문자 인코딩 방식입니다.
    1바이트와 2바이트로 문자를 표현하며, 한글 음절은 2바이트로 표현됩니다.
    EUC-KR과 호환성을 가지고 있습니다.

  6. 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계산에 유의해야한다 !

다양한 종류의 인코딩

  1. 바이너리 데이터 인코딩:

    • 바이너리 데이터 인코딩은 컴퓨터에서 사용되는 이진 형식의 데이터를 표현하기 위해 사용됩니다.
    • 텍스트 데이터와 달리 이진 데이터는 바이트 단위로 표현되며, 다양한 인코딩 방식을 사용할 수 있습니다.
    • 일반적인 바이너리 데이터 인코딩 방식으로는 Base64 인코딩이 있습니다. Base64는 8비트 바이너리 데이터를 64개의 문자로 표현하는 인코딩 방식입니다.
    • 바이너리 데이터 인코딩은 이메일 첨부 파일, 이미지 데이터 전송, 데이터 압축 등에서 활용됩니다.
  2. URL 인코딩 :

    • URL 인코딩은 URL에서 사용할 수 없거나 특별한 의미를 가지는 문자를 안전하게 전송하기 위해 사용됩니다.
    • URL에서는 알파벳, 숫자, 일부 특수 문자만을 허용하기 때문에 다른 문자를 URL에 포함시키기 위해 인코딩이 필요합니다.
    • URL 인코딩은 '%' 기호와 함께 해당 문자의 ASCII 코드를 16진수로 표현합니다. 예를 들어, 공백 문자는 '%20'으로 인코딩됩니다.
  3. Hex 인코딩 :

    • Hex 인코딩은 이진 데이터를 16진수로 표현하는 인코딩 방식입니다.
    • 16진수는 0부터 9까지의 숫자와 A부터 F까지의 알파벳으로 이루어져 있습니다.
    • Hex 인코딩은 각 바이트를 16진수로 표현하여 이진 데이터를 텍스트 형태로 변환합니다.
    • 예를 들어, 8비트 바이트의 값이 170인 경우, Hex 인코딩을 통해 "AA"로 표현됩니다.
  4. 마크업 언어 인코딩 (Markup Language Encoding):

    • 마크업 언어(예: XML, HTML)에서는 특수 문자를 표현하기 위해 문자 인코딩이 필요할 수 있습니다.
    • 마크업 언어 인코딩은 문자 집합을 지정하고, 특수 문자를 해당 문자 집합의 문자 코드로 표현함으로써 안전하게 표현합니다.
    • 예를 들어, XML 문서에서는 <와 같은 HTML 특수 문자를 그대로 사용할 수 없으므로, 문자 집합과 함께 해당 문자를 표현하는 방식을 사용합니다.
profile
주니어 백엔드 개발자

0개의 댓글