UTF-8 유니코드란?


UTF-8 유니코드

[ 컴퓨터 상식 목차 보기 ]

컴퓨터의 저장 단위 – Bit와 Byte

우리는 매일 컴퓨터나 스마트폰을 들여다보며 채팅하기 하고 문서작업을 한다. 우리는 아주 자연스럽게, 인간의 언어로 (당연히!) 자연스럽게 데이터를 저장하고 전송한다. 하지만 컴퓨터는 이러한 글자들을 이해하지 못한다. 컴퓨터가 아는 글자라곤 0과 1이 다다. 사실 글자가 아니라 숫자라고 해야 할 터이다. 컴퓨터는 전자회로로 만들어졌고, 하나의 메모리 소자는 전기를 on/off시키는 시스템으로 작동한다. 이런 하나의 유닛을 비트(Bit)라고 부른다. 재밌는 부분은, 1 비트는 2개의 정보(0과 1)를 저장할 수 있지만, 2 비트는 4개의 정보(00, 01, 10, 11)를 저장할 수 있다. 여기까진 그럴려니 하지만, 3 비트는 6개의 정보가 아니라 8개의 정보를 저장할 수 있다는 것이다. 000, 001, 010, 011, 100, 101, 110, 111 이렇게 말이다. 이렇게 8개의 비트가 모이면, 이 유닛을 바이트(Byte)라고 부른다. 1 바이트는 2의 8승 (2 * 2 * 2 * 2 * 2 * 2 * 2 * 2), 즉 256개의 정보를 저장할 수 있다.

컴퓨터는 어떻게 문자를 저장할까?

컴퓨터가 가진 언어는 0과 1밖에 없는데 어떻게 인간언어의 수많은 글자들을 저장하고 표시할 수 있을까?

이러한 문제를 해결하기 위해서 각 글자마다 번호를 붙이는 방법을 사용한다. 예를 들면 영어 대문자 A를 65번, B를 66번 이런식으로 말이다. 이렇게 글자를 숫자로 연결시키는 작업을 인코딩(Encoding)이라고 한다. 이러한 인코딩 방식은 모든 사람들이 통일된 하나의 규칙을 가져야 할 것이다. 만약 내 컴퓨터에서는 65를 A로 표시하는데, 다른 컴퓨터에서는 65를 Z로 표시한다면, 컴퓨터간 채팅도 못할 뿐더러, 문서도 서로 다른 글자로 표시할 것이다. 이래서 만든 첫 번째 약속된 규칙이 아스키 (ASCII) 코드이다. 아래에 표시된 표가 바로 아스키 코드이며, 왼쪽에 표시된 Decimal(10진수)은 컴퓨터에 저장되는 숫자를 의미하고, 오른쪽에 표시된 Char(문자)은 인간언어의 글자이다. 0 – 32번까지는 사실 눈에 보이는 글자는 아니고, 문서조작에 관련된 기능들이다. 컴퓨터 문서 작성 시에는 글자 외에 필요한 기능들이 필요한데, 예를 들어 8번 backspace, 9번 tab, 13번 엔터, 27번 ESC, 32번 스페이스 등을 들 수 있다. 그리고 33 – 126번까지는 시각적인 글자들이 들어가 있다. 127번 DEL에 해당한다.

(그림 출처)

따라서 아스키 코드를 따르는 약속에서는, 1글자를 표시하는데 128개의 숫자가 필요하다는 것을 알 수 있다. 그럼 128개를 저장하기 위해서는 몇 비트가 필요할까? 2의 7승이 128이므로 7비트면 아스키코드의 1글자를 저장할 수 있다. 그리고 나머지 1비트는 통신에러검출 목적(Ref 1)으로 쓰여서, 한 글자에 1바이트 체제를 구축했다. 이러한 에러검출용 비트를 Parity Bit라 불렀으며, 7비트 중의 1의 개수가 홀수면 1, 짝수면 0을 넣어서, 전송 중에 데이터 변질을 체크하는 용도로 사용되었다.

한글은 어떻게 저장할까?

위의 아스키 코드 표를 보면 한글에 해당되는 아스키 값이 없다. 한글은 어떻게 저장되는 것일까?

초창기는 영어만을 표시했기 때문에 아스키 코드만으로도 충분했지만, 컴퓨터가 발전하고 인터넷이 보급되고, 각 나라별의 언어를 표시해야하는 순간이 다가왔다. 그래서 전세계 모든 문자를 표시할 수 있는 새로운 인코딩이 필요해졌고, 전 세계 문자를 다 모아서 만든 문자 집합(Charset)이 바로 유니코드(Unicode)이다. 같은 유니코드 일지라도 다른 방식으로 인코딩을 할 수 있는데, UTF-8과 UTF-18가 대표적이다.

UTF-8 유니코드는 가변길이 문자 인코딩 방식으로 한 문자를 나타내기 위해 1바이트에서 경우에 따라서는 4바이트까지 사용한다. 아스키 코드의 7비트는 그대로 UTF-8에 포함시켰고, 나머지 1비트는 0을 채워서 0XXXXXXX 의 2진법 형태로 저장하였다. 이렇게 아스키 코드까지는 한 글자에 1바이트를 체제로 사용한다. 그 뒤로로는 한 글자를 2바이트 체제로 표시하는데, 1바이트 체제와 혼동이 발생할 수 있으므로, 2바이트 중 첫번째 바이트는 110으로 시작하고, 2번째 바이트에는 10으로 시작하게 만들었다. 아래 표를 참조하자. 이렇게 함으로써 1 바이트 체제와 구분할 수 있게 했다. 3바이트 체제와 4바이트 체제도 아래 표와 같이 특정 숫자를 앞에 배치함으로써, 몇 바이트 체제인지를 구분할 수 있게 디자인 했다 (Ref 2).

1 바이트 체제0XXXXXXX
2 바이트 체제110XXXXX 10XXXXXX
3 바이트 체제1110XXXX 10XXXXXX 10XXXXXX
4 바이트 체제11110zzz 10zzXXXX 10XXXXXX 10XXXXXX

반면 UTF-16는 기본적으로 한 글자를 2바이트 체제로 표시하는 방법이다. 관심있으신 분들은 Ref 2에서 더 자세히 읽어보시기 바란다.

따라서 문서관련 작업을 하거나 웹 관련 작업을 할 때, 문자집합을 직접 지정해줘야 할 때가 있다. 특히 아스키 코드를 지정 해버리면 한글이 다 깨져서 나오는 불상사가 발생한다. 이런 문제를 해결하기 위해 보통은 UTF-8 유니코드를 지정해준다. 예를 들어보면, HTML에서 <head></head> 부분에 <meta charset=”utf-8″>을 넣어주는데 이 부분이 바로 인코딩 방식을 지정해주는 부분이다. 이 외에도 PHP나 데이터베이스 MySQL에서도 UTF-8을 설정해줘야 하는 경우가 있다.

<참조 인용>

Ref 1. 아스키 코드에서 나머지 1비트(Parity Bit)는 통신에러검출 목적으로 사용되었다.

Ref 2. UTF-8 비트 패턴 / UTF-16 비트 패턴

[ 컴퓨터 상식 목차 보기 ]

Leave a Reply