본문 바로가기

웹 기술 쌈싸먹기/용어정리

문자를 사용한 수 표현, 색을 표현하는 방법

문자를 사용한 수 표현

  • UTF-8은 문자(예:A)를 표현하는 비트들(2진수 0000000001000001)로부터 
    나온 숫자들(0x0041)을 표현하는 숫자들(UTF-8로 인코딩한 값)을 표현하기 위해 
    숫자(실제 유니코드 값 0x0041을 UTF-8로 인코딩한 0x41)들을 사용한다.
    하지만 이제는 문자를 사용해 수를 표현할 수도 있다고 하네요.
    컴퓨터와 컴퓨터 사이의 통신이 시작되고 사람들은 더 많은 정보를 컴퓨터 사이에 송수신하고 싶어서
    2진 데이터를 전송하고 싶었다고 합니다.
    하지만 2진 데이터를 직접 보내는 것은 생각처럼 단순하지 않다고해요.
    아스키 코드 중 상당수가 제어문자로 예약되어 있고 이런 제어문자는 시스템에 따라 처리하는 방식이 다르고
    몇몇 시스템은 7비트만 송수신할 수 있었습니다.

👉 ASCII 코드표
👉 유니코드 문자를 UTF-8로 표현 범위

 

👉 유니코드 문자를 UTF-8로 표현

  • 예시 1: 문자 A는 아스키 문자이며 유니코드 값은 65로, 이는 16진수 0x41(0100 0001)인데, 7비트 이내로 표현 가능하므로 UTF-8로도 0x41로 표현된다.
  • 예시 2: 문자 π는 유니코드 값이 7비트를 벗어난다. 그러나 11비트 이내에 표현이 가능한 비교적 앞쪽에 위치한 문자며, 따라서 그림과 같이 2바이트에 표현이 가능 하다.
  • 예시 3: 문자 은 한글 문자로 16비트를 모두 사용한다. 마지막 16비트가 1이며 따라서 이를 표현하기 위해서는 그림과 같이 3바이트를 사용해야 한다. 참고로 유니코드에는 완성형 한글 11,172자뿐만 아니라 조합형 자모가 모두 포함되어 있으며, 이처럼 한글의 UTF-8 인코딩 값은 모두 각 문자당 3바이트를 차지한다.

UTF-8로 변환된 유니코드 문자의 용량을 정리하면,
  • 1바이트를 차지하는 글자는 U+0000~007F 영역으로서, 아스키 코드의 127개의 문자가 있다.
  • 2바이트를 차지하는 글자는 U+0080~07FF 영역으로서, 유니코드/0000~0FFF의 일부인 제어문자, 라틴어, 음성기호, 조정문자, 결합문자, 그리스어, 키릴(러시아어 등), 아르메니아어, 히브리어, 아랍어, 시리아어, 타나문자(몰디브), 은코문자(아프리카)의 1920개의 문자가 있다.
  • 3바이트를 차지하는 글자는 U+0800~FFFF 영역으로서, 유니코드/0000~0FFF의 일부부터(사마리아 문자~) 유니코드/F000~FFFF까지라는 유니코드 대부분의 문자들 6만여개가 포함된다.
    • 한글 조합형 자모는 U+1100~11FF[3] 영역에 위치한다.
    • 한글 완성형 자모는 U+3130~318F 영역에 위치한다.
    • 한글 완성형 글자는 U+AC00~D7A3[4] 영역에 위치한다. 예를 들어 '갑'의 유니코드값은 16진수 0xAC11(1010 1100 0001 0001)인데, 이는 총 16비트가 필요하므로 1110 1010 1011 0000 1001 0001 으로 표현한다

 

1) 출력 가능하게 변경한 인코딩

이 방식은 ACSII 문자가 아닌 놈들만 "=XX"(X:0~9, A~F)와 같은 모양으로 인코딩하는 방식을 말한다. 따라서 7Bit ASCII로 표현할 수 없는 문자는 한 바이트가 3바이트로 늘어난다. 따라서 이 방식은 크기가 최대 3배로 늘어날 수 있어 효율성 면에서는 최악이라 할 수 있다.

이 인코딩 방식은 영어문화권에서 보면 나쁜 인코딩이 아닐 수 있다. 영어문화권에서 만들어지는 텍스트는 대부분 한 문자가 7비트 ASCII 문자로 되어있고 그렇지 않는 문자는 훨씬 적다. 따라서 이 방식으로 인코딩 할 경우 대부분의 글자가 인코딩 되지 않고 일부분만 인코딩이 된다.
오히려 효율적일 수 있고 다양한 디코딩을 수행하지 못하는 MUA에서 메일을 보더라도 대략적으로 내용을 파악할 수 있다. 반면 한글과 같이 거의 Non-ASCII 문자의 메세지나 바이너리 파일의 경우 이 방식으로 인코딩시 이점이 없다. 메모리나, 디스크, 네트워크만 더 많이 잡아먹을 뿐이다.
Quoted-Printable 인코딩은 디코딩이 안 되더라도 내용을 대략적으로 알아볼 수 있지만 효율성이 낮고 base64 인코딩은 효율성은 높지만 디코딩 전까지 내용을 전혀 알아볼 수 없다.
대부분의 ASCII 문자가 많은 텍스트나 HTML의 경우 QP방식으로 인코딩 하는 경우가 많고 한글이나 바이너리 파일은 base64로 주로 인코딩한다.
 

2) 베이스64 인코딩

Base64란 Binary Data를 Text로 바꾸는 Encoding(binary-to-text encoding schemes)의 하나로써 Binary Data를 Character set에 영향을 받지 않는 공통 ASCII 영역의 문자로만 이루어진 문자열로 바꾸는 Encoding이다.

Base64를 글자 그대로 직역하면 64진법이라는 뜻이다. 64진법은 컴퓨터한테 특별한데 그 이유는 64가 2의 제곱수 64=2^6이며 2의 제곱수에 기반한 진법 중 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법이기 때문이다. (ASCII에는 제어문자가 다수 포함되어 있기 때문에 화면에 표시되는 ASCII 문자는 128개가 되지 않는다.)

핵심은 Base64 Encoding은 Binary Data를 Text로 변경하는 Encoding이다.

변경하는 방식을 간략하게 설명하면 Binary Data를 6 bit 씩 자른 뒤 6 bit에 해당하는 문자를 아래 Base64 색인표에서 찾아 치환한다. (실제로는 Padding을 더해주는 과정이 추가된다.)

👉 base64 테이블
👉 base64 인코딩 방식

 

3) URL 인코딩 / 디코딩("퍼센트 인코딩"으로도 부른다.)

먼저, URL 인코딩이란 URL에서 URL로 사용할 수 없는 문자 혹은 URL로 사용할 수 있지만 의미가 왜곡될 수 있는 문자들을 '%XX'의 형태로 변환하는 것을 말한다. 여기서 XX는 16진수 값이다. 그리고 URL 디코딩이란 변환된 URL을 다시 원래의 형태로 되돌리는 것을 말한다. URL 인코딩/디코딩 과정을 그림으로 나타내면 다음과 같다. 자세한 설명은 아래에서 진행하도록 하겠다.

 

👉 "&"은 URL에서 특별한 의미를 지니어 아스키코드 16진수값 26인 "%26"으로 표기한다.

 

그렇다면 URL 인코딩/디코딩은 왜 필요한 것일까? 이것을 이해하면 왜 URL 인코딩/디코딩이 위 그림과 같이 이뤄지는지 이해할 수 있게 될 것이다. 이 질문에 대한 답은 앞서 소개한 URL 인코딩의 정의에서 찾을 수 있다.

 

1) 먼저, 인터넷을 통해 전송할 수 있는 문자는 오로지 ASCII 문자이기 때문이다. 따라서 ASCII 문자가 아닌 문자는 인터넷을 통해 전송할 수 있는 형태로 변환해줘야 한다. 위 그림에서 빨간색으로 표시된 '피그'라는 문자와 파란색으로 표시된 '브라더'라는 문자가 바로 그 예시이다. 한글은 ASCII 문자가 아니므로 변환이 필요하다. 그리고 이때 변환하는 규칙은 UTF-8을 따른다. UTF-8에 따르면 한글 문자 1개는 3바이트로 인코딩 된다. 따라서 '피그'는 6바이트로, '브라더'는 9바이트로 인코딩 된 모습을 볼 수 있다.

 

2) 다음으로, ASCII 문자라 하더라도 예약된 의미를 가지고 있는 문자의 경우, 그 문자 자체의 의미를 전달하고 싶은 경우에는 이스케이프 처리가 필요하기 때문이다. 이러한 문자의 대표적인 예시로는 '/', '&', '=' 등이 있다. '/'은 URL의 각 레벨을 구분해주는 역할을 맡고, '&'는 쿼리 파라미터들을 구분해주는 역할을 맡으며, '='은 쿼리 파리미터의 값을 지정해주는 역할을 맡는다. 이처럼 이러한 문자들은 ASCII 문자이지만 URL 내에서 특별한(예약된) 의미를 가지고 있다. 따라서 이러한 문자들을 문자 그 자체의 의미로서 전달하고 싶다면 이스케이프 처리가 필요하다. 위 그림에서 keyword라는 쿼리 파라미터의 값으로 '피그&브라더'를 보내고 싶은 경우가 바로 그 예시이다. 여기서 '&'를 이스케이프 해주지 않으면 쿼리 파라미터의 구분자로 인식이 되어 왜곡된 의미가 전달이 될 것이다. 따라서 '&'를 '%26'으로 인코딩을 하여 문자 그대로의 '&'을 전달하고자 한다는 것을 나타내야만 한다.

 

 


색을 표현하는 방법

  • 숫자를 사용하는 일반적인 경우 중에는 색표현이 있다. 
  • 컴퓨터의 이미지는 어떻게 저장될까?

우리는 컴퓨터가 0과 1만을 사용해서 자료를 저장한다. 컴퓨터는 0과 1 외의 다른 수를 사용하지 못하므로 이미지 역시 컴퓨터에 저장을 할 때는 0과 1의 이진수를 사용해서 이미지를 저장하여야 한다.

컴퓨터 모니터나 인쇄물에서 볼 수 있는 모든 디지털 이미지들을 아주 크게 확대하면, 그림의 경계선들이 연속된 곡선이 아니라 작은 사각형들이 붙어서 사각형들이 마치 계단같이 보이는 것을 알 수 있다. 이처럼 디지털 이미지들은 더 이상 쪼개지지 않는 네모 모양의 작은 점들이 모여서 전체 그림을 만든다.

이때 이미지를 이루는 가장 작은 단위인 이 네모 모양의 작은 점들을 ‘픽셀(Pixel)’이라고 한다. 픽셀은 영어로 그림(picture)의 원소(element)라는 뜻을 갖도록 만들어진 합성어로 우리말로는 ‘화소(畵素)’라고 번역한다. 화소의 수(픽셀의 수)가 많을수록 해상도가 높은 사진(그림)을 얻을 수가 있다. 같은 면적 안에 픽셀, 즉 화소가 더 조밀하게 많이 들어 있을수록 그림이 더 선명하고 정교하기 때문이다. 예를 들어 “이 그림은 해상도가 640픽셀×480픽셀이다.”라는 말은 이 그림 속에 작은 사각형 점(즉, 화소=픽셀)이 640×480=30만 7200개 들어 있다는 뜻이 된다. 이처럼 컴퓨터는 이미지를 표현할 때도 픽셀이 없다=0, 있다=1의 이진수를 사용한다.

👉 (출처-네이버 지식백과)
👉 컴퓨터에 이미지가 저장되는 과정(픽셀을 이진수로 표현)

 

  • 컴퓨터 모니터는 빨간색, 녹색, 파란색 광선을 섞어서 색을 만들어낸다. 이런 색 표현법을 RGB색 모델이라고 부른다. 손으로 그림을 그리면 가산색 시스템(빛 혼합)보다 감산색 시스템(물감 혼합)에 더 익숙할 것이다. 두시스템 모두 우리 눈이 볼 수 있는 모든 색을 만들기에는 한계가 있지만, 가산시스템(빛 혼합)이 감산 시스템(물감 혼합) 보다 더 많은 색을 만들어낼 수 있다.

 

1) 가산 혼합의 원리

👉 가산 혼합방식의 원리

 

2) RGB와 디스플레이

  • RGB 가산혼합을 사용하고 있는 일반적인 사례로는 음극선관(브라운관), 액정 디스플레이, 플라스마 디스플레이와 같이 컴퓨터, 텔리비전의 영상 표시에 사용되는 디스플레이다. 화면을 구성하는 각 픽셀은 컴퓨터와 그래픽 카드  등으로 빨강, 초록, 파랑의 명도(Value)를 표현한다. 이들 수치는 감마 보정으로 표현하고 싶은 휘도에서 디스플레이에 표시되는 휘도(intensity)와 전압으로 전환되고 있다.
  • 빨강, 초록, 파랑 세 종류의 광원의 조합을 통해 여러 가지 색을 표현한다. 2017년 기준으로 전형적인 디스플레이는 하나의 픽셀에 24비트 규모의 정보를 사용하고 있다. 이는 8비트를 각각 빨강, 초록, 파랑에 각각 할당함으로써 각 색상(hue)마다 256가지의 명도, 선명도를 결정한다. 이 시스템으로는 16,777,216가지(2563혹은 224)의 색상(hue), 채도(saturation), 명도(value)를 표현할 수 있다.

👉 RGB색 구성

  • 사용하지 않는 비트 8개에는 투명도 요소를 표현하기 위해 사용한다. 투명도란 해당 색을 투과해 볼수 있는 정도를 말한다.

 

3) 투명도 추가

  • RGBA는 red green blue alpha(레드 그린 블루 알파)를 의미한다. 색 공간으로 정의되기도 하지만 실제로는 3개의 RGB색 모델에 4번째 알파 채널이 보충된 것이다. 알파는 각 화소가 얼마나 투명한지를 나타내며 알파 합성을 사용하여 이미지를 다른 이미지와 합성할 수 있게 하며, 여기에는 투명한 면과 투명 부분의 모퉁이의 안티에일리어싱 부분이 포함된다.

👉 RGBA색 구성

 

4) 색인코딩

  • 웹 페이지는 주로 사람이 읽을 수 있는 UTF-8 문자의 시퀀스로 이뤄지는 텍스트를 표현하기 때문에, 텍스트를 사용해 색을 표현할 방법이 필요하다. URL 인코딩과 비슷한 방법으로 색을 인코딩한다.
  • 웹에서 십육진수쌍으로 색을 표현하는 방법은 RGB 가산혼합에 의한 것이다. 적(red), 녹(green), 청(blue)에 해당하는 두 자리 십육진수 세 쌍으로 색깔을 나타낼 수 있다. 한 채널에 1바이트가 할당되므로 모두 3바이트의 정보로 색을 표현한다. 웹에서 색을 지정할 때에는 특수기호 #과 3쌍의 두자리 십육진수를 연속하여 사용한다.

👉 웹 색상 표현방식

 

출처 : https://namu.wiki/w/UTF-8

출처 : https://wikidocs.net/126660

출처 : https://xn--lg3bu39b.xn--mk1bu44c/9

출처 : https://en.wikipedia.org/wiki/Base64

출처 : https://it-eldorado.tistory.com/143

출처 : https://www.nise.go.kr/sedu/pt/page1_02.html

출처 : https://ko.wikipedia.org/wiki/RGBA_%EC%83%89_%EA%B3%B5%EA%B0%84

출처 : https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%83%89%EC%83%81