인코딩 (Encoding)

인코딩 이란

사람이 인지할 수 있는 문자(언어)를 약속된 규칙에 따라 컴퓨터가 이해하는 언어(0과 1)로 이루어진 코드로 바꾸는 것을 통틀어 일컫는다.

즉, encoding이란 정해진 규칙에 따라 코드화, 암호화, 부호화 하는 것을 말한다.

 

문자 셋 (Character Set) = 코드표

인코딩과 디코딩을 위해 미리 정해놓은 규칙으로, 초기 표준 문자열 셋은 ASCII 등이 있었음.

그러나 인터넷이 전 세계로 보급되면서 이로 표현할 수 없는 문자들이 등장하여 이들을 포함한 새로운 문자 셋이 등장하게 됨 (유니코드 등)

 

문자 인코딩과 문자 셋

- 문자 인코딩 : 문자를 컴퓨터가 이해할 수 있는 신호로 만드는 것

- 문자 셋 : 인코딩과 디코딩을 위해 미리 정해놓은 규칙 (매핑표)

 

 

인코딩의 종류

문자 인코딩, 사진&오디오&비디오 인코딩 등이 있다.

 

문자 인코딩 (Character Encoding)

"문자"를 "bytes (바이트)"로 변환시킨다.

 

ASCII Encoding

미국에서 정의하고 있는 표준, 영문 알파벳을 위한 대표적인 문자 인코딩

- 7bit 인코딩으로 총 1byte(8bit)에서 7bit을 사용하여 128개의 문자를 표현할 수 있음 (0~127)

- 나머지 1bit은 에러 검출을 위한 Parity bit으로 비워두어, 총 1 byte로 문자를 표현

(7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0으로 설정된 Parity bit를 함께 전송함.)

 

확장아스키코드(Extended ASCII) = ANSI 코드

기존 아스키 코드의 7bit이 아닌 8bit을 문자를 표현하는데 사용하여 총 256개의 문자 표현이 가능함

 

멀티바이트 인코딩(Multibyte Encoding)

처음 멀티바이트 인코딩이 사용된 것은 CJK(Chinese-Japanese-Korean) 멀티바이트 인코딩으로

한국어, 중국어, 일본어는 문자의 수가 매우 많기 때문에 확장아스키코드 영역의 128개로도 부족했기 때문에 등장

따라서 1byte가 아닌 여러 byte를 통해 문자를 표현한 것이 멀티바이트 인코딩이다.

한국의 인코딩 방식은 여러 인코딩 방식을 거쳐왔다.

  • 조합형 한글 인코딩
    • 한글의 자음과 모음을 조합해서 표현 
    • 2byte 조합, 3byte 조합, N byte 조합과 같은 여러 방식을 사용
  • 완성형 한글 인코딩
    • 자음과 모음을 합쳐서 완성된 문자로 표현 
    • EUC-KR : 2350자 / CP949(MS949) : 11172자 를 사용

UNICODE Encoding

멀티바이트 인코딩 문제는 한국에 국한된 문제가 아니라, 중국어 일본어 등에도 발생한 문제

각자의 언어를 표현할 수 있는 인코딩 방식과 다른 문자열 셋을 사용하기에, 모든 언어를 동시에 표현할 수가 없었음

결국 전 세계의 모든 문자를 하나의 문자 셋으로 표현할 수 없을까? 라는 문제가 등장

이에 전 세계의 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드

 

- 모든 문자를 2bytes로 표현하려 했으며, 이론적으로 65536개의 문자를 표현 가능

- 2bytes로 모두 담지 못하는 문자들이 있어(한글의 조합, 한자, 히라가나 등), 1byte로 평면을 나누어 총 2~3bytes를 통해 유니코드로 표현

- 유니코드 나타내는 U+와 16진수를 합쳐 U+0000 ~ U+FFFF 까지 문자 표현 가능

- 앞에 평면을 위한 1byte인 U+00에서 U+FF를 추가 가능 (총 256개의 평면 가능)

 

구현 방법에 따라 여러가지로 나뉨

* UTF-8 Encoding

유니코드 인코딩 중 가장 기본. 8bit을 기본으로 사용하며, ASCII 코드와 직접 호환 가능

하지만 가변 인코딩 방식이라 각 글자마다 1~4bytes로 상이한 바이트 수를 가지게 되어 string 조작이 힘듦

 

* UTF-32 Encoding

UTF-8과 반대로 최대 메모리를 사용. 각 글자는 고정된 4bytes의 넓이를 가지고 있어 string 조작이 간편해짐.

 

* UTF-16 Encoding

UTF-8과 UTF-32를 반반 섞은 인코딩

대부분의 글자를 고정된 너비(fixed width) 2bytes 를 가지고, 특수한 경우 이를 넘어가는 가변 너비를 가짐

 

Base64 Encoding

Binary Data를 Text로 바꾸는 Encoding(Binary-to-text encoding)의 하나로써,

Binary Data를 Character set에 영향 받지 않는 공통 ASCII 영역의 문자로만 이루어진 문자열로 바꾸는 인코딩

* 사용하는 이유

- 문자를 전송하기 위해 설계된 Media(Email, HTML) 등을 이용해 플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 전송하게 되면 나오는 문제를 해결하기 위해 등장

- 문제 1. ASCII는 7bit encoding인데 나머지 1bit을 처리하는 방식이 시스템별로 상이함

- 문제 2. 일부 제어문자의 경우, 시스템별로 다른 코드값을 가짐

이에 ASCII는 시스템간 데이터 전달에 안전하지가 않기에, Base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용하여 인코딩함

 

URL Encoding

인터넷을 통해 전송될 수 있는 포맷으로 문자를 변환시키는 인코딩 방식 

* 사용하는 이유

- URL은 ASCII 셋 문자 집합만을 사용하기에, 그 외의 문자는 유효한 ASCII 형식으로 변환되어야 함 ('%XX' 의 형식)

- ASCII 문자라도 예약된 의미를 가지는 경우, 예약된 의미가 아닌 문자 자체의 의미를 전달하고 싶은 경우 이스케이프 처리가 필요하기 때문

* 형식

- 기존 문자열의 HEX값 앞에 '%' tkdyd

- 한글 : UTF-8 사용

 

HTML Encoding

HTML 문서 안에 있는 특정한 문자들을 안전하게 브라우저에 표시하기 위해 사용되는 인코딩

* 사용하는 이유

- HTML 내에서 스크립트와 같이 특수한 기능을 하는 문자들을 안전하게 표현하여 보안성을 높이기 위해 사용함

- XSS(크로스 사이트 스크립트) 의 방어 대책으로 사용됨

* 형식

- ASCII 코드값을 기준으로 인코딩 됨

- 코드의 앞에 %# 문자가 포함됨

 

디코딩(Decoding)

인코딩의 반대되는 개념으로 복호화, 역코드화의 의미를 가짐

컴퓨터가 이해하는 언어를 사람이 이해할 수 있는 언어로 바꾸는 것

 

참고

https://simyj.tistory.com/14

https://effectivesquid.tistory.com/entry/Base64-%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80

https://limvo.tistory.com/7

+ Recent posts