본문 바로가기
컴퓨터 구조와 운영체제

문자는 컴퓨터에 어떤 bit형태로 저장될까? 왜 이렇게 쓸까?

by cuziam 2023. 4. 3.

우리가 컴퓨터에서 사용하는 문자는 어떤 bit로 저장될까? 그리고 어떻게 사용될까? 우리가 사용하는 프로그래밍 언어들은 문자 자료형을 지원한다. 하지만 컴퓨터는 기계이고, 우리가 사용하는 일반문자를 사용하지 않는다. 컴퓨터는 이진수로 변환된 문자, 즉 이진수로 인코딩된 문자를 사용한다. 이 글에서 다루고자 하는 것은 아스키코드, 유니코드, utf-8과 같은 인코딩이 무엇인지, 그리고 왜 나타났는지에 대해서 알아보고자 한다.


아스키코드

아스키코드란 미국 정보교환 표준 부호(ASCII: American Standard Code for Information Interchange)의 약자로, 1960년대 초에 미국의 표준화 기관에서 제정한 문자 인코딩 표준이다. 이 표준은 128개의 다른 문자 값을 나타낼 수 있다. 이 값은 7비트 이진수로 인코딩된다. 하지만 우리가 실제로 사용하는 문자는 1byte (8bit)이다. 다른 1bit는 어디에 사용될까? 1bit는 오류 검출 및 정정을 위한 패리티 비트(parity bit)로 사용된다.

 

아스키코드 테이블

아스키 코드는 처음에는 영문자, 숫자, 특수 문자 등을 나타내기 위해 사용했다. 하지만 나중에 아스키 코드의 쓰임이 확장되어 제어 문자도 나타낸다. 제어 문자란 말 그대로 장치들을 제어하기 위해서 사용하는 문자이다. 여기에서 사용되는 제어 문자의 상당 수는 통신 제어를 위해 사용되는 문자들이다.

 

아스키코드의 단점: 표현할 문자는 많은데 비트는 너무 적다.

아스키코드는 참 단순하고 이해하기도 쉽다. 하지만 문제점이 있다. 아스키코드는 고작 7bit이며, 7bit로는 최대 128개의 문자만 나타낼 수 밖에 없다. 처음엔 알파벳만 나타내면 충분했을 뿐더러, 메모리 공간에 대한 비용도 현재에 비해 비쌌기 때문에 128개의 문자로도 충분했다. 하지만 알파벳이 아닌 다른 문자를 사용하는 나라들은 어떻게 했을까?

확장된 아스키코드(extended ASCII)

 

초기 컴퓨터들은 미국산 아니면 영국산이었다. 컴퓨터가 널리 쓰이게 됨에 따라 다양한 언어들을 지원할 필요성이 있었다. 유럽어권에선 국제 표준 기구(ISO: International Standard Organization)가 ISO-8859와 같은 국제 표준을 만들었다. 이 국제표준은 확장된 아스키코드(extended ASCII)라는 것을 정했다. 확장된 아스키코드는 기존의 아스키코드에 유럽 언어에 필요한 악센트 기호나 발음 구별 기호(diacritical mark)를 추가했다. 이 방법은 일반적인 아스키코드와 달리 패리티 비트를 사용하지 않고 8bit 모두를 문자 표현을 위해 사용한다. 확장된 아스키코드 덕에 프랑스어, 독일어, 터키어, 키릴 문자등을 표현할 수 있게 되었다.

 

이외의 다른 나라들은 어떻게 했을까? 유니코드를 사용하기 전엔 대부분 각 나라마다 표준을 만들어 사용했다. 하지만 시간이 지나면 지날수록 서로 공통된 인코딩 방식이 필요했다.


 

유니코드

메모리 공간에 대한 비용이 저렴해짐에 따라, 문자를 굳이 1byte안에 구겨 넣을(?) 필요가 없어졌다. 그래서 유니코드라는 새로운 국제 표준이 생겼다.

 

유니코드는 전 세계의 거의 모든 문자를 담을 수 있는 국제 규격(ISO-10646 표준)의 문자 인코딩 방식이다. 최초의 유니코드는 16비트(2바이트)로 문자를 인코딩했다. 16bit면 이론상 65536개의 문자를 표현할 수 있다. 유니코드를 사용하면서 다양한 언어의 문자를 상호 운용할 수 있게 되었다.처음엔 이 2바이트로 충분할 것이라고 생각했지만… 현존하는 모든 문자들을 유니코드로 편입시키려는 노력이 이어졌고 현재 유니코드는 21bit까지 확장되었다.

 

유니코드의 단점: 메모리…

근데 유니코드로 모든 문자들을 표현할 수 있다는 것은 알겠다. 하지만 이런 의문이 생긴다. 유니코드의 크기는 최소 2bytes로 고정되어 있다. 메모리 절약의 관점에서 보면 1byte로 표현할 수 있는 것들도 굳이 2bytes 이상을 사용하기 때문에 비효율적이다.

 

예를 들어 ‘컴퓨터AB’라는 문자에서 한글과 알파벳 모두 유니코드로 표현하면 2*5=10bytes의 크기를 갖는다. 하지만 ‘컴퓨터’에서 각 문자를 2bytes, ‘AB’에서 각 문자는 아스키코드(1byte)로 표현하면 충분하다. 8bytes면 충분한 것을 2bytes나 낭비하여 표현하게 된다. 만약 각 문자마다 가변 길이의 비트를 사용한다면 이러한 문제점을 해결할 수 있게 된다.

 

*이모티콘이나 여러 고대문자들도 이 유니코드로 표현한다.

*유니코드 공식 사이트: https://home.unicode.org/ → 유니코드에 대해 필요한 모든 지식은 이 곳에서 얻을 수 있다.

 

Home

 

home.unicode.org


유니코드 인코딩, UTF-8

‘모든 문자를 자유롭게 사용하되 아스키코드랑 호환도 되도록 하고, 가변 길이 비트를 사용해서 메모리만 좀 아껴보자.’ 이러한 컨셉에서 비롯된 인코딩 방식이 이른바 UTF(Unicode Transform Format)-8 방식의 인코딩이다. 유니코드가 문자를 표현하는 방식이라면, ‘유니코드 인코딩’은 문자를 저장하는 방식이라고 생각하면 컨셉을 이해하기 쉬울 것 같다. 이름을 보면 뒤에 숫자가 붙는데 8, 16 ,32과 같은 숫자가 붙는다. 이 때 숫자는 인코딩한 덩어리를 8bit로 자르는지, 16bit로 자르는지, 32bit 자르는지에 따라 다르다.

 

utf-8 인코딩의 예시

 

구체적인 예시는 위와 같다. 앞서 설명하였듯이 가변길이의 비트를 사용하는 것이다. 아스키코드로 표현할 수 있는 것은 그대로 1byte만 사용하고, 다른 것들은 사용된 비트에 따라서 2~4bytes로 나눈다. utf-8방식을 살펴보면 앞 쪽에 1110, 110, 10, 0과 같은 비트 시퀀스가 나타나는데 이것은 각 옥텟(바이트)이 담고 있는 데이터의 크기에 따라 달라진다. 문자열은 내부적으로 현재 대부분의 문자는 utf-8 인코딩을 이용하여 저장된다.

 

*utf -8(위키피디아): https://ko.wikipedia.org/wiki/UTF-8

 

UTF-8 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만들었다. UTF-8은 Universal Coded Character Set + Transformation Format – 8-bit의

ko.wikipedia.org


여담

인코딩 방식을 파악해야 하는 중요한 이유: 아직까지 사용자 프로그램 별로 인코딩이 다른 경우가 적지 않다.

 

utf-8방식 이외에도 다양한 인코딩 방식이 존재한다. utf-8로 모든 프로그램의 문자 인코딩이 통일되어 있다면 편할 수도 있지만 한국어 같은 경우 EUC-KR, CP949와 같은 인코딩도 심심치 않게 볼 수 있다. utf-8이라는 표준 이전에 계속 사용하던 인코딩이었기 때문에 그런 것으로 추측된다. 다행히 요즘 개발되는 프로젝트들은 utf-8로 인코딩을 통일하는 경우가 점점 흔해지고 있는 추세라고 한다.