brunch

You can make anything
by writing

C.S.Lewis

by 수수수 Apr 12. 2023

인코딩과 디코딩

https://www.youtube.com/watch?v=6hvJr0-adtg&t=2446s

https://www.youtube.com/watch?v=A8tO4D1Gtc0


<2024.03.09 수정>

저는 AI와 LLM, 새로운 기술과 서비스에 대해서 관심이 많고 관련된 글을 쓰고 있습니다!

System Prompt 비교

AI 자동화 서비스, AgentHub

관심 있으시면 이 글들도 한번씩 봐주세요!



인코딩과 디코딩에 대해서 많이 들어는 보았지만, 실제로 어떤 개념인지 정확히 알지 못했고, 평소에 구독하던 유튜브에서 이를 다루었으므로 관련해서 알아본 내용을 정리해보려 한다. 이 글은 ChatGPT GPT-4의 도움을 받아 작성되었다.


목차  

1. 인코딩과 디코딩의 정의와 원리

2. 문자 인코딩의 역사와 발전: ASCII, Unicode, UTF-8

3. 웹 개발에서의 인코딩과 디코딩

4. 마무리


1. 인코딩과 디코딩 개요

Encode와 Decode는 ‘code’라는 단어를 공통적으로 포함하고 있다.

위키피디아에 따르면

In communications and information processing, code is a system of rules to convert information-such as a letter, word, sound, image, or gesture-into another form, sometimes shortened or secret, for communication through a communication channel or storage in a storage medium.
통신 및 정보 처리에서 코드는 정보(예: 문자, 단어, 소리, 이미지 또는 제스처)를 다른 형태로 변환하기 위한 규칙 체계. 이는 때때로 축약되거나 비밀스럽게 변환되어 통신 채널을 통한 전달 또는 저장 매체에 저장.

이라고 명시되어 있다.

이를 참고해 컴퓨터의 맥락 속에서 설명하면, 인코딩이란, 문자와 같이 사람이 해석할 수 있는 데이터를 이진 형식(binary format)으로 변환하여 컴퓨터가 처리할 수 있게 하는 과정이다. 디코딩은 인코딩의 역과정으로, 이진 형식의 데이터를 사람이 해석할 수 있는 데이터로 변환하는 작업이다.


인코딩과 디코딩은 데이터를 효율적으로 저장, 전송, 처리할 수 있도록 하는 중요한 역할을 수행한다. 인코딩은 데이터 압축, 다른 형식으로 변환하여 저장 공간 절약, 전송 시간을 줄이는 데 도움이 된다. 디코딩은 인코딩된 데이터를 원래의 형태로 되돌려 사용자가 이해할 수 있게 만드는 역할을 한다.


예를 들어, 문자 인코딩은 문자를 컴퓨터가 이해할 수 있는 바이너리 데이터로 변환하는 과정이다. ‘A’라는 문자는 ASCII 인코딩 시스템에서 ‘01000001’이라는 이진수로 표현되고, 이렇게 인코딩된 데이터를 원래의 문자로 되돌리는 과정이 디코딩이다.


유튜브 영상을 참고해, 이 글에서는 문자열의 인코딩에 관해 주로 다룬다.


2. 문자 인코딩의 역사와 발전: ASCII, Unicode, UTF-8

2.1 개요

초기의 문자 인코딩 시스템인 ASCII(American Standard Code for Information Interchange)는 1960년대에 개발되었다. ASCII는 알파벳 대문자와 소문자, 숫자, 특수문자 등 128개의 문자를 7비트 바이너리 코드로 표현하는데, 다양한 언어와 문자를 표현하기에는 한계가 있었다.

이러한 한계를 극복하기 위해 전 세계의 모든 문자를 고유한 숫자로 매핑하여 표현할 수 있는 Unicode와 UTF-8이 등장했다.


2.2 ASCII

2.2.1 역사

1960년대에 통신 및 컴퓨팅에서 사용되는 텍스트와 제어 문자를 인코딩하기 위한 표준을 만들기 위해 개발되었다. 각 문자에 고유한 숫자를 할당하며, 총 128개의 문자(대문자 및 소문자 영어 문자, 숫자, 구두점 및 일부 제어 문자 포함)를 나타내기 위해 7비트를 사용한다.


2.2.2 장점

간단하고 구현하기 쉬움
컴퓨팅 시스템에서 널리 지원됨


2.2.3 단점

한정된 문자 세트 (128개 문자만 사용 가능)
영어 이외의 언어나 특수 문자를 표현할 수 없음.


2.2.4 ANSI

ANSI는 American National Standards Institute의 약자로, 문자 인코딩의 맥락에서는 ASCII를 기반으로 프랑스어, 독일어, 스페인어 등 서유럽 언어를 지원하기 위해 추가적인 문자를 포함하는 Windows-1252 문자 인코딩을 가리킨다.

그러나 사실 ANSI는 미국의 다양한 산업을 위해 자발적으로 합의된 표준을 개발하는 기관이지만, 문자 인코딩에 대한 표준은 제공하지 않아 Windows-1252가 정확한 표현이다.

표준화 되어 있지 않았으며, 현재는 유니코드 기반의 표준 인코딩 방식의 도입으로 ANSI는 레거시 코드 대부분 대체되었다.


2.3 Unicode

2.3.1 역사

1980년대에 ASCII 및 기타 인코딩 체계의 한계를 극복하기 위해 개발되었다.
전 세계적으로 사용되는 모든 문자에 대해 고유한 숫자(코드 포인트)를 제공하는 것을 목표로 한다.


2.3.2 작동원리

유니코드는 문자 집합의 각 문자에 고유한 코드 포인트를 할당함으로써 작동한다.
코드 포인트는 문자 집합 내의 각 문자에 할당된 숫자 값이다.
이는 컴퓨터가 문자를 나타내고 처리할 수 있도록 고유한 식별자 역할을 한다.
예를 들어, 문자 “A”의 코드 포인트는 U+0041이고, 숫자 문자 “3”의 코드 포인트는 U+0033이다.


2.3.3 장점

많은 수의 문자를 지원(100만개 이상)
다국어 텍스트를 인코딩하는 일관된 방법을 제공
시스템과 어플리케이션간의 데이터 교환을 용이하게 함


2.3.4 단점

여러 인코딩 형식 (UTF-8, UTF-16, UTF-32)이 있어 혼란이나 호환성 문제가 발생할 수 있음
일부 문자에 대해 더 많은 저장 공간이 필요


2.4 UTF-8 (Unicode Transformation Format — 8-bit)

2.4.1 역사

1992년 Ken Thompson과 Rob Pike에 의해 개발된 Unicode의 가변 길이 문자 인코딩 방식이다.


2.4.2 작동원리

Unicode 코드 포인트에 따라 각 문자를 나타내기 위해 1~4 byte를 사용한다.
코드 포인트가 U+0000에서 U+007F 사이인 ASCII 문자는 1byte로 표시되고, 비-ASCII 문자는 3 byte(24bit)가 필요하다.

예를 들어, 문자열 “lbh”를 utf-8로 인코딩 해보자.
각각은 모두 1byte로 표시될 수 있는 범위 내에 있으므로,
‘l’: U+006C → 0b1101100 → 0x6C
‘b’: U+0062 → 0b1100010 → 0x62
‘h’: U+0068 → 0b1101000 → 0x68
라고 바꿀 수 있고, 이를 결합해 표현하면, 0x6C 0x62 0x68가 된다.

영문이 아닐 경우인 ‘삼성’을 살펴보자.
각각은 모두 3byte로 표시될 수 있는 범위 내에 있으므로
‘삼’: U+C0BC -> 0b11000000101100 -> 0xE3 0x82 0xBC
‘성’: U+C131 -> 0b11000100110001 -> 0xE3 0x84 0xB1
라고 바꿀 수 있고, 이를 결합해 표현하면, 0xE3 0x82 0xBC 0xE3 0x84 0xB1가 된다.


2.4.3 장점


ASCII와의 호환성이 높음(UTF-8의 처음 128개 문자는 ASCII와 동일)
대부분의 텍스트에 대해 효율적인 저장(일반적인 문자에 대해 더 적은 바이트 사용)
웹의 기본 인코딩으로 널리 사용되고 있음


2.4.4 단점

가변길이 인코딩으로 인해 문자열 조작 및 처리가 느려질 수 있음
UTF-8에서 일부 문자는 다른 유니코드 인코딩(예: UTF-16)과 비교하여 더 많은 바이트가 필요할 수 있음


3. 웹 개발에서의 인코딩과 디코딩

웹 개발에서는 여러 가지 인코딩과 디코딩 방식이 사용된다.
이 중 URL 인코딩과 Base64 인코딩에 대해 정리할 것이다.


3.1 URL 인코딩

웹에서는 URL(Uniform Resource Locator)을 사용하여 리소스의 위치를 나타낸다.
URL은 특정 문자가 예약된 의미를 가지고 있기 때문에, 이러한 문자를 안전하게 전송하려면 인코딩이 필요하다.
URL 인코딩은 예약된 문자와 불안전한 문자를 백분율 기호(%)와 함께 16진수 값으로 변환한다.
예를 들어, 공백 문자는 URL 인코딩을 통해 ‘%20’으로 변환된다.


3.2 Base64 인코딩

웹 개발에서는 텍스트 데이터가 아닌 이미지, 오디오 파일 등 바이너리 데이터도 처리해야 할 경우가 있다.
이러한 바이너리 데이터를 텍스트 기반 형식인 HTML, JSON 등에서 안전하게 처리하려면 Base64 인코딩이 사용된다.
Base64 인코딩은 바이너리 데이터를 64개의 문자로 구성된 텍스트 데이터로 변환한다.
Base64 인코딩은 데이터 크기를 약 33% 증가시킨다.
이런 점을 고려하여 큰 파일이나 데이터 집약적인 애플리케이션에서는 Base64 인코딩의 사용을 신중히 결정해야 한다.
그럼에도 불구하고 다음과 같은 사용 사례가 있다.


3.2.1 HTML에서 이미지 삽입하기

Base64로 인코딩된 이미지는 데이터 URI를 사용하여 HTML이나 CSS 파일에 직접 삽입할 수 있다.
이 방식은 전송 과정에서 더 많은 데이터를 보내는 대신 HTTP 요청 수를 줄이고 작은 이미지 처리를 단순화하는 데 도움이 된다.


3.2.2 JSON에서 바이너리 데이터 처리하기

JSON 형식은 바이너리 데이터를 직접 지원하지 않는다.
따라서 Base64 인코딩을 사용하여 JSON 객체 내에서 바이너리 데이터를 텍스트 문자열로 표현할 수 있다.


3.2.3 텍스트 기반 프로토콜에서 바이너리 데이터 전송하기

이메일(MIME)과 같은 텍스트 기반 프로토콜을 사용할 때, Base64 인코딩은 바이너리 데이터를 텍스트로 안전하게 전송하는 데 사용된다.


5. 마무리

우연히 본 동영상을 계기로 그동안 개념이 잡혀있지 않았던 인코딩과 디코딩에 대해 얕게나마 정리할 수 있었다.
단순히 컴퓨터에 관련된 규칙이다, 라고 알고 있는 것보단 base64와 같이 뚜렷한 목적이 있는 기술로 발전되는 과정을 배우는 것이 기억에 많이 남는 것 같다.
GPT-4를 활용해 작성했고, 레퍼런스를 제공해주지 못한다는 점이 명백한 단점으로 작용하고 있는 것으로 보인다.
하루빨리 레퍼런스까지 제공해줄 수 있는 플러그인이 제공되기를 바란다.
아마 해당 페이지는 계속 읽어보면서 부족한 부분, 부정확한 부분을 수정할 것 같다.
그래도 2주 간 노션에만 있던 내용을 정리할 수 있어서 후련하다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari