brunch

You can make anything
by writing

C.S.Lewis

by zwoo Jul 11. 2021

알아두고 기억해야 하는 텍스트 문자 인코딩

바이트, 16진수, 유니코드(UCS-2), UTF-8


모바일 앱과 전동킥보드는 블루투스 통신 과정을 통해 연결된다. 블루투스 통신은 1989년에 개발된 근거리 무선 통신 방식으로, 짧은 거리를 사이에 둔 전자 장비 간에 전파를 이용해 정보를 교환할 수 있는 기술이다. 전자기기들은 보통 MAC 어드레스라는 고유 식별번호를 가지며, 이 주소를 통해 서로를 인지하고 데이터를 주고받을 수 있다.


블루투스와 글의 주제가 연결되는 부분은, 바로 '바이너리 데이터'라는 부분이다. 블루투스 통신은 물리계층에서 전기신호를 전송하고, 한단계 위인 데이터 링크 계층에서 MAC 어드레스를 가지고 상호 식별을 한다. ( 그 위로는 OSI 7 계층과는 비슷하게 생겼지만 다른 독자적인 계층구조를 갖는다.)


바이너리 데이터

전기신호로 나타낼 수 있는 최소단위는 '켜다, 끄다' 두가지 경우이다. 컴퓨터는 데이터를 1과 0으로 이루어진 이진수로 변환해서 저장한다.


1비트 (bit)

데이터(정보)의 최소단위이며, 1과 0 두가지 수를 표현할 수 있는 크기이다. 이 단위는 너무 작기 때문에, 8비트씩 묶어서 1바이트라고 부르기로 했다.


1바이트 (Byte)

1비트가 표현할 수 있는 수는 1과 0이므로, 8개의 자릿수를 갖는 1바이트는 2의 8제곱만큼(256개)의 수를 표현할 수 있는 크기를 최대로 갖는다.  2진수로는 0부터 11111111,  10진수로 변환하면 0부터 255까지의 숫자까지 표현할 수 있는 것이다.



1바이트 = 11111111 (2) = FF (16)

그런데 11111111이라는 숫자가 표기하기에 너무 길어서 메모리를 많이 차지하기 때문에, 16진수로 짧게 줄여서 표현하는 방식이 고안되었다.


10진수 기준으로 한자리 수인 0부터 9까지는 16진수에서도 동일하게 표현된다. 10진수 기준으로 두자리 수인 10부터는 16진수에서는 A부터 F까지의 로마문자를 사용해서 한자리수로 표현된다.

즉 16진법 체계에서는 숫자 10개와 알파벳 6개, 총 16개의 캐릭터(char)를 조합해 수를 표현한다. (이 글에서는 숫자와 각국 언어의 텍스트문자 각각을 캐릭터라고 부르겠다)

10진법에서 10보다 작은 9까지를 한자리로 표현할 수 있듯이, 16진법으로는 16보다 작은 15까지는 모두 이렇게 단 한자리로 표현이 가능하다.


앞서 언급한 1바이트를 16진수로 줄여서 표현하는 방식은 다음과 같은 방법으로 이루어졌다. 8비트 8자리를 네개씩 반으로 나누어서 생각하면, 왼쪽 4자리와 오른쪽 4자리는 각각 이진수로 0부터 1111까지 표현이 가능하다. 이진수 1111은 10진수로 표현하면 15, 16진수로 표현하면 F이다. 그러므로 앞서 1바이트로 표현할 수 있는 최대값인 11111111을 왼쪽과 오른쪽을 나누어서 각각 16진수로 표기하면 FF가 되는 것이다.

일반적으로 이 숫자가 16진수 정수임을 컴퓨터에게 알려주는 구분자로 0x를 붙인다. 따라서, 1바이트는 이진수 11111111, 16진수로 0xFF이며, 이것은 총 256개의 캐릭터를 표현할 수 있는 크기이다.  



유니코드

예전에 영어권에서는 라틴문자와 숫자, 특수문자를 컴퓨터에 입력시키는 데에 ASCII 문자코드체계가 표준으로 사용되었다. ASCII 코드체계는 7비트로 모든 문자와 숫자, 웬만한 특수문자를 표현하기에 충분했기에, 1바이트 단위로 통신할 때 남는 1비트는 에러검출코드로 활용되었다.

 

하지만 영어 알파벳을 사용하지 않는 다른 언어의 문자는 캐릭터가 너무 많은 경우도 있어서 ASCII 문자코드체계의 여분의 1비트까지 사용해도 역부족이었다. 또 언어마다 제각각의 문자코드를 가지면 제각각의 인코딩 (컴퓨터에 이 캐릭터가 뭔지 알려주는 것)과 디코딩(이진 데이터를 인간의 언어로 출력하는 것) 방식이 필요했다. 다른 언어의 문자코드를 출력할 때 전혀 엉뚱한 캐릭터들로 출력되는 문제가 있었기 때문이다. 각종 언어의 문자코드를 위해 일일이 별도의 인코딩 디코딩 방식으로 대응하기란 쉬운 일이 아니어서 표준화하기 위한 많은 노력들이 있었고 가장 최근에 유니코드 인코딩 방식(UCS-2)이 등장했다.


유니코드 인코딩(UCS-2)의 목적은 크게 두가지였다. 한 캐릭터를 1바이트가 아닌 2바이트로 늘려서 표현할 수 있는 문자의 개수를 늘리는 것, 그리고 그렇게 생겨나는 2의 16승 ( 65536 ) 개의 공간에 거의 모든 언어의 문자와 기호들을 담아서 통일된 인코딩 체계를 만드는 것이었다. 이렇게 하자, 실제로 대부분의 문자 캐릭터를 통일된 문자코드로 표기하고 동일한 인코딩, 디코딩 방식으로 입출력하는 것이 가능했다.


우리에게 비교적 친숙한 UTF-16, UTF-8 포맷은 유니코드에 더 많은 문자와 기호들을 추가하고자 하는 욕심에서 등장했다.


UTF-16은 문자캐릭터의 크기를 2바이트 (16비트) 로 고정하는 것이 아니라, 2바이트를 넘어서는 문자에 대해서는 4바이트로 표현하는 것이다.


UTF-8은 문자캐릭터의 크기를 최소 1바이트, 최대 6바이트까지 사용하는 가변 인코딩이다. 현재 점유율이 가장 높아서 사실상의 표준 유니코드 방식으로 활용되고 있다.





TMI1.

내 인생에서 숫자라고는 10진수밖에 없었기 때문에, 2진수와 16진수 변환을 이해하는 과정에서 암호를 해독하는 것 같은 어려움이 있었다.


TMI2.

유니코드 단락은 스택오버플로우의 창립자인 JOEL SPLOSKY   <JOEL ON SOFTWARE>참고했다. 문자열 인코딩이나 유니코드 체계가 뭔지, 아스키 코드 체계랑 어떻게 다른지 제대로 알지 못하는 프로그래머가 만약 자신의 글을 읽고 있다면  챕터를 끝까지  읽기 전까지 다시는 코드를 한줄도   생각을 하지 말라고,  그러면 벌을  거라고 해서 끝까지  읽었다.




Photo by T. Al Nakib from FreeImages

작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari