ASCII, Unicode(유니코드), UTF-8 이해하기

|

이 글은 공부 중에 작성하는 글입니다.
정정이 필요한 내용은 댓글로 알려주시면 감사하겠습니다 :)


안녕하세요 오동나무입니다.

오늘은 간단하게 ASCII, Unicode, UTF-8에 대해서 알아보려고 합니다. 생각보다 내용이 어렵지는 않더군요.

image

이 사진은 ASCII 코드표의 일부입니다.

ASCII, Unicode, UTF-8는 간단하게 이야기하면 문자들을 숫자와 1:1 매칭시킨 문자표 (CharacterSet)입니다. 우리가 단어장을 외우듯이 컴퓨터가 인간의 문자를 알아볼 수 있도록 인간의 문자 - 컴퓨터가 읽을 수 있는 숫자의 형태로 표를 만들어서 컴퓨터에게 쥐어주는 것이지요.

궭붥붭괴ㅅㄹ..

외국의 프로그램, 게임을 다운받아서 사용해보면 한글이 깨져서 위와 같은 이상한 문자가 나타나는 경우가 종종 있습니다. 이렇게 문자가 깨지는 이유가 바로 문자를 표기할 때 사용하는 문자표가 다르기 때문입니다.



ASCII

ASCII는 ASCII, Unicode, UTF 중에서 가장 먼저 나온 문자표입니다. ASCII(American Standard Code for Information Interchange)에서 보시다시피 A는 American의 약자로 세계의 많은 언어 중에 영어 알파벳만을 표기할 수 있는 문자표입니다.

ASCII는 7비트 인코딩으로 영문 알파벳 대소문자 52개, 10개의 숫자, 32개의 특수 문자, 하나의 공백 문자로 95개의 출력 가능한 문자들로 이루어져있습니다. 여기에다가 출력 불가능한 제어문자까지 합치면 총 128개의 문자로 이루어져있습니다. 대부분의 문자 인코딩은 ASCII에 기초를 두고 있다고 합니다.

ASCII 코드표 보러 가기(위키 백과)


Unicode (유니코드)

ASCII는 언급한대로 영어 알파벳만 표기가 가능한 문자표입니다. 하지만 컴퓨터가 세계적으로 널리 보급되면서 다양한 나라들의 언어를 표현할 수 있는 문자표가 만들어져야했고, 이때 아주 다양한 엔지니어가 다양한 방식의 문자표를 만들게 됩니다. 하지만 문자표가 많아지면 문자를 주고 받는데에 기준이 다를테니 혼란스럽겠죠? 그래서 국제 표준의 문자표로 만들어진 것이 바로 Unicode(유니코드) 입니다!

그러면 이제 국제 표준이 생겼으니.. 문자를 표시하는데에 문제가 없을 것 같지만! 유니코드에도 단점이 있습니다. 유니코드는 ASCII 코드와 달리 문자마다 크기가 달라집니다. 어떤 것은 1byte, 어떤 건 2byte, 어떤 건 3byte … 4byte…

이렇게 문자의 크기가 달라지는 이유는 세계에는 정말 많은 문자들이 존재해서 이 문자들을 모두 표현하기에는 8비트라는 공간이 부족해지기 때문입니다. 8비트 내에서 모든 문자들을 표현할 수 없다는 이야기입니다. 하지만 ASCII의 경우 총 128개의 문자로 모두 8비트 안에서 표현이 가능했기 때문에 모든 문자가 1byte로 일정했습니다.

이렇게 문자의 크기가 다르니 컴퓨터는 몇 바이트가 한 글자인지, 몇 바이트 단위로 끊어서 처리해야하는지에 대한 어려움이 생기게 됩니다. 이런 문제를 해결하기 위해 등장한 것이 UTF 인코딩입니다. 즉, 유니코드 앞에 새로운 문자표를 붙여 이 문자가 몇 byte를 차지하는지 컴퓨터에게 알려주기 위한 인코딩인 것입니다.


UTF-8

이제 ASCII, Unicode, UTF에 대해서 이해가 되네요! 하지만 UTF도 16이 있고, 8이 있고, 32가 있던데.. UTF는 왜 여러가지로 또 나뉘게 되었을까요?

UTF 뒤에 오는 16, 8, 32는 글자를 담는 그릇의 크기라고 이해할 수 있습니다. 아래의 그림을 볼까요? 그림은 Youtube-팀노바 채널에서 캡쳐해온 것입니다! 정말 이해하기 쉽게 설명해주시더라구요!

image

사진을 보면 특수문자를 각각 UTF-16, 8, 32로 표기하고 있습니다. 이때 같은 문자이지만 UTF에 따라 저장하는 크기가 다른 것을 볼 수 있습니다. UTF-16에서는 모두 16비트의 크기를 가지고, UTF-8에서는 8비트의 크기인 느낌표(!)를 제외하고는 24비트를, UTF-32에서는 32비트의 크기를 가지고 있습니다.

이렇게 인코딩 방식을 여러개로 만들어 둔 이유는 문자마다 인코딩 방식에 따라 효율성이 다르기 때문입니다. ASCII 코드 범위 내에서만 사용할 경우에는 UTF-8을 사용하는게 문자의 크기가 모두 8비트로 작겠죠? 만약 UTF-16을 사용한다면 문자의 크기가 2배나 커져버리니 말입니다. 하지만 오로지 한글만 사용한다고 할 경우에는 UTF-16이 더 유리합니다. UTF-8의 경우 글자당 24비트를 차지하니 UTF-16에 비해 1.5배나 큰 메모리를 사용할 것입니다. (UTF-32는 지금으로서 가장 마지막에 추가된 문자일 확률이 높기 때문에 아직 자주 사용되지는 않는다고 해요!)

한글 문서에서는 대부분 euckr을, 대부분의 웹에서는 UTF-8을 사용하고 있다고 합니다. 그래서 둘 사이에서 문자를 주고받을 때 문자가 깨지는 일이 발생하는 것입니다. (인코딩 방식이 다르기 때문에) 그리고 UTF-16이 유리한 경우에도 메모리의 불이익이 있더라도 호환성 때문에 UTF-8을 선택하는 경우도 많다고 합니다.



참고