컴퓨터는 문자를 어떻게 표현할까? 먼저 인코딩과 디코딩이라는 개념을 알아야한다.
✨인코딩(encoding)이란?✨
: 문자를 컴퓨터가 이해할 수 있는 비트 패턴(0과 1)로 변환하는 것을 의미한다. 정해진 문자셋(문자표)에 따라 인코딩을 하며 주로 사용하는 문자셋으로는 아스키코드와 유니코드가 있다.
예를 들어 문자표에서 0001 = a, 0010 = b라고 되어있다고 치자. 사용자가 'ab'를 입력하면 컴퓨터는 0001 0010으로 변환 즉 인코딩해서 저장한다.
✨디코딩(decoding)이란✨
: 디코딩은 인코딩의 반대 개념으로 컴퓨터의 코드를 문자로 변환하는 것을 의미한다.
컴퓨터가 'ab'를 0001 0010으로 저장하고 있으면 문자표에서 0001 0010에 해당하는 문자를 찾아 'ab'로 출력하는 것이 디코딩이다.
위에서 많이 사용하는 문자표현방식에 아스키코드와 유니코드가 있다고 했는데 하나씩 알아보도록 하자
아스키코드는 정보 교환을 위한 미국 표준 코드의 약자로 (American Standard Code for Information Interchange: ASCII) 그 당시 경쟁에서 이긴 텍스트를 표현하는 방식이다.
키보드에 있는 모든 기호에 대해 7비트의 수 값을 할당했다. 7비트면 2⁷개, 총 128개의 문자를 표현할 수 있고 아스키코드표도 0번 부터 127번까지 있는 것이다. 매우 단순하여 어떤 시스템에도 적용이 가능하나 7비트만 사용하기 때문에 2바이트이상의 코드를 표현할 수 없다는 단점이 있다.
위 표에서 제어문자로 표시된 문자들은 장치나 통신 제어를 위한 문자들이다. 예를 들어 6번 ACK(수신확인)은 메세지를 받았음을 의미하고 21번 NAK(반수신확인)은 메세지를 받지 못했을을 의미한다.
비트의 가격이 떨어짐에 따라 문자에 16비트 코드를 부여한 유니코드라는 새로운 표준이 만들어졌다. 또 사용하는 비트수에 따라 유니코드는 각기 다른 인코딩을 사용해 비트의 낭비를 최대한 막았다.
몇 비트를 이용해 하나의 index를 표현할 것인지에 따라 UTF-8, UTF-16, UTF-32로 나뉜다.
(UTF = Unicode Transformation Format)
위 그림에서 8개의 비트 덩어리들이 모여 인덱스를 나타낸다. 영문은 1byte로 인덱스가 표현가능해 1byte를 사용한 모습이고 나머지 문자도 정해진 바이트수만큼 사용되어 인덱스를 표현하고 있다.
문자를 사용한 수 표현이라는 뜻은 c언어로 비유하자면 char a = '1'같은 것이다.
그런데 몇 가지 궁금한 점이 생겼다.
❗️ 일단 컴퓨터간 통신을 할 때 다수의 2진수가 제어문자로 예약되어 있고, 제어 문자는 시스템에 따라 처리하는 방식이 달라서 2진데이터를 직접 보내는 것은 생각보다 어려웠다. 그래서 수를 문자로 표현해야하는데 어떤 시스템은 7비트만 송수신 가능한 경우가 있어 이 경우 다른 인코딩방법을 사용한다.
❗️아스키코드는 8비트를 사용하지만 1자리는 에러검출을 위해 비워두고 7자리만 사용한다. 그렇기 때문에 7비트만 송수신 가능한 시스템에서는 사용할 수 없다.
이제 7비트 데이터만 지원하는 통신 경로를 통해 송수신하기 위한 인코딩 방법에 대해 알아보겠다.
QP인코딩이라고도 하며 전자우편 첨부를 처리하기 위해 만들어졌다.
기호 '=' 다음에 각 니블(4비트)을 표현하는 16진 숫자 2개를 추가해 8비트 값을 표현한다.
= ㅁㅁㅁㅁ ㅁㅁㅁㅁ
⬆️ 이런식으로 인코딩된다.(ㅁ는 비트)
QP인코딩은 1바이트를 표현하기 위해 3바이트를 사용하는데 이렇게 되면 통신속도가 굉장히 느려진다. 베이스 64인코딩은 더 효율적인 방법이다.
24비트를 6비트덩어리 4개로 나누고, 각 덩어리의 6비트값에 출력가능한 (printable)문자를 할당해 표현한다.
ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁ
이런 구조로 인코딩 되며 베이스 각 6비트 덩어리에 베이스64 문자 인코딩 표에 해당하는 값을 넣어 표현한다.
이 인코딩은 모든 3바이트 조합을 4바이트 조합으로 변환시킬 수 있는데 원본데이터가 3바이트의 배수가 아닐 경우 패딩(padding)문자를 도입해 해결한다.
원본데이터에 2바이트가 남으면 끝에 =을 붙이고 1바이트가 남으면 끝에 ==을 붙인다.
이 인코딩 방식은 여전히 전자우편 첨부파일 전송에 많이 사용중이다.
URL인코딩은 퍼센트인코딩이라고도 부른다. url에서 특별한 의미를 가지는 문자들이나 아스키코드에 없는 문자를 %를 붙여 다르게 표현한다.
예를 들어 URL에서 특별한 의미를 가진 /는 %2F로 대신 사용한다.
모니터는 픽셀(pixel, 화소)로 이루어져있고 픽셀은 RGB를 표현하는 부분인 서브픽셀들로 구성되어 있다. 컴퓨터는 빛을 혼합해 사용하는 가산 시스템을 이용하며, RGB에서 각각에서 내는 빛의 양과 조합으로 색깔을 나타낸다.
그럼 이 색들을 코드로 어떻게 나타낼까? 색은 숫자를 사용해 나타낼 수 있는데 최소단위인 8비트 1덩어리당 R,G,B를 각각 할당해 3덩어리인 24비트에다 담을 수 있다. 하지만 컴퓨터는 32비트 운영체제부터 사용하기 때문에 8비트 4덩어리를 사용하고 남는 1덩어리에는 투명도를 표현한다.
텍스트를 사용해 색을 표현할 방법이 필요해 16진 트리플렛(hex triplet)을 통해 표현한다.
#rrggbb 형식으로 표현하며 rrggbb에는 각 색상에 해당하는 16진법 숫자를 사용한다.
그래서 #000000은 검정 #ffffff는 흰색을 나타낸다. (16진법은 0~f까지니까)