인코딩과 디코딩 개요
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’이라는 이진수로 표현되고, 이렇게 인코딩된 데이터를 원래의 문자로 되돌리는 과정이 디코딩이다.
인코딩: 'A'라는 문자에서 아스키코드 65로 변환하는 것을 말함
디코딩: 반대로, 65에서 'A'라는 문자로 변환하는 것을 말함
아스키 코드 vs 유니코드
Windows 에서의 유니코드(UNICODE)
문자셋(Character Sets) 의 종류와 특성
- 아스키 코드 : 미국에서 정의하고 있는 표준이다. 알파벳의 개수는 26개이다. 여기다가 몇몇 확장 문자 를 포함해도 총 256개를 넘지 않는다. 그래서 1바이트를 가지고도 충분히 표현할 수 있다. 다시 말해서 아스키 코드는 1바이트로 표현이 된다.
- 유니코드 : 영어가 아닌 다른 국가에서 사용하는 문자들도 표현해야 한다. 유니코드는 문자를 표현하는 데 있어서 균일하게 2바이트를 사용한다. 2바이트면 나타낼 수 있는 문자의 종류가 65,536개에 이른다. 이 정도면, 영어와 한글은 물론이거니와 전세계의 모든 문자와 다양한 종류의 기호를 표현할 수가 있다.
문자셋이란 문자들의 집합, 다시 말해서 "약속된 문자의 표현 방법"을 의미한다.
문자셋은 그 종류에 따라서 다음과 같이 크게 세 가지 형태로 나뉘어진다.
SBCS (Single Byte Character Set)
- 문자를 표현하는데 1바이트만을 사용하는 방식이다.
- 우리에게 가장 익숙한 아스키코드가 대표적인 SBCS에 해당한다.
MBCS(Multi Byte Character Set )
- 다양한 바이트 수를 사용해서 문자를 표현하는 방식이다. 어떤 문자는 1바이트로 표현하고 어떤 문자는 2바이트로 표현한다. 한글은 2바이트 사용, 영문은 1바이트 사용
- 문자를 표현하는데 있어서 표현하는 바이트의 형태가 multi다.
- 문자열의 길이에 따라서 바이트의 크기가 정해지는게 아니라 문자열을 구성하는게 한글이냐 영문이냐에 따라 다르게 표현이 될 수 있다.
- 안전성에 문제가 있다.
WBCS[Wide Byte Character Set]
- 유니코드가 WBCS 방식에 해당한다.
- WBCS 는 모든 문자를 2바이트로 처리하는 문자셋이다.
문자 인코딩 방식
문자 인코딩 방식은 컴퓨터에서 문자를 이진 데이터로 표현하는 방법을 의미
- ASCII (American Standard Code for Information Interchange)
영문 알파벳, 숫자, 특수 문자 등을 7비트 이진수로 표현하는 가장 기본적인 문자 인코딩 방식입니다. 0부터 127까지의 숫자로 각 문자가 대응됩니다.
- ISO-8859 (Latin-1)
ASCII를 확장하여 서유럽 언어의 문자를 포함하는 인코딩 방식입니다. ISO-8859-1부터 ISO-8859-15까지 다양한 버전이 있습니다.
- UTF-8 (Unicode Transformation Format - 8-bit):
유니코드를 가변 길이의 이진수로 인코딩하는 방식으로, 가장 널리 사용되는 문자 인코딩 방식 중 하나입니다. 영문 알파벳은 1바이트로 표현되고, 다국어 문자는 2바이트에서 4바이트까지 가변적으로 표현됩니다.
- UTF-16 (Unicode Transformation Format - 16-bit):
유니코드를 16비트로 고정 길이로 인코딩하는 방식입니다. 모든 문자가 2바이트로 표현되며, 대부분의 문자는 2바이트로 표현되지만 일부 특수한 문자는 4바이트로 표현됩니다.
위와 같이 여러가지 문자 인코딩 방식이 존재한다. 이중 UTF-8에 대해 자세히 알아보겠다.
UTF-8 (Unicode Transformation Format - 8-bit)
역사
1992년 Ken Thompson과 Rob Pike에 의해 개발된 Unicode의 가변 길이 문자 인코딩 방식이다.
작동원리
Unicode 코드 포인트에 따라 각 문자를 나타내기 위해 1~4 byte를 사용한다. 코드 포인트가 U+0000에서 U+007F 사이인 ASCII 문자는 1byte로 표시되고, 비-ASCII 문자는 3 byte(24bit)가 필요하다. 예를 들어, 문자열 “Ibh”를 utf-8로 인코딩 해보자. 각각은 모두 1byte로 표시될 수 있는 범위 내에 있으므로, ‘I’: 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가 된다.
장점
ASCII와의 호환성이 높음(UTF-8의 처음 128개 문자는 ASCII와 동일) 대부분의 텍스트에 대해 효율적인 저장(일반적인 문자에 대해 더 적은 바이트 사용) 웹의 기본 인코딩으로 널리 사용되고 있음
단점
가변길이 인코딩으로 인해 문자열 조작 및 처리가 느려질 수 있음 UTF-8에서 일부 문자는 다른 유니코드 인코딩(예: UTF-16)과 비교하여 더 많은 바이트가 필요할 수 있음
웹 개발에서의 인코딩과 디코딩
웹 개발에서는 여러 가지 인코딩과 디코딩 방식이 사용된다.
이 중 URL 인코딩과 Base64 인코딩에 대해 정리할 것이다.
URL 인코딩
웹에서는 URL(Uniform Resource Locator)을 사용하여 리소스의 위치를 나타낸다. URL은 특정 문자가 예약된 의미를 가지고 있기 때문에, 이러한 문자를 안전하게 전송하려면 인코딩이 필요하다.
URL 인코딩은 예약된 문자와 불안전한 문자를 백분율 기호(%)와 함께 16진수 값으로 변환한다. 예를 들어, 공백 문자는 URL 인코딩을 통해 '%20'으로 변환된다.
Base64 인코딩
웹 개발에서는 텍스트 데이터가 아닌 이미지, 오디오 파일 등 바이너리 데이터도 처리해야 할 경우가 있다. 이러한 바이너리 데이터를 텍스트 기반 형식인 HTML, JSON 등에서 안전하게 처리하려면 Base64 인코딩이 사용된다.
Base64 인코딩은 바이너리 데이터를 64개의 문자로 구성된 텍스트 데이터로 변환한다. Base64 인코딩은 데이터 크기를 약 33% 증가시킨다.
이런 점을 고려하여 큰 파일이나 데이터 집약적인 애플리케이션에서는 Base64 인코딩의 사용을 신중히 결정 해야 한다.
그럼에도 불구하고 다음과 같은 사용 사례가 있다.
HTML에서 이미지 삽입하기
Base64로 인코딩된 이미지는 데이터 URI를 사용하여 HTML이나 CSS 파일에 직접 삽입할 수 있다. 이 방식은 전송 과정에서 더 많은 데이터를 보내는 대신 HTTP 요청 수를 줄이고 작은 이미지 처리를 단순화 하는 데 도움이 된다.
JSON에서 바이너리 데이터 처리하기
JSON 형식은 바이너리 데이터를 직접 지원하지 않는다. 따라서 Base64 인코딩을 사용하여 JSON 객체 내에서 바이너리 데이터를 텍스트 문자열로 표현할 수 있다.
텍스트 기반 프로토콜에서 바이너리 데이터 전송하기
이메일(MIME)과 같은 텍스트 기반 프로토콜을 사용할 때, Base64 인코딩은 바이너리 데이터를 텍스트로 안 전하게 전송하는 데 사용된다.
참고
https://brunch.co.kr/@simplebrunch/13
https://www.youtube.com/watch?v=GVX-m3RF-K0&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc
'운영체제 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
뇌를 자극하는 윈도우즈 시스템 프로그래밍 6장 (0) | 2024.09.05 |
---|---|
뇌를 자극하는 윈도우즈 시스템 프로그래밍 5장 (0) | 2024.05.04 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 4장 (0) | 2024.05.04 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 3장 (0) | 2024.05.03 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 1장 (0) | 2024.05.02 |