인코딩, UTF-8, Base64

ron ron·2024년 7월 7일
0

인코딩 (Encoding)

인코딩은 컴퓨터에서 정보를 저장하거나 전송하기 위해 사용되는 변환이다. 동영상 인코딩의 경우 다양한 장치에서 재생할 수 있는 형태로 변환하는 작업이다. 문자 인코딩은 문자를 0과 1의 나열로 바꾸는 것이다. 예를 들어, 사과라는 문자는 UTF-8로 인코딩할 시 1110 1100 1000 0000 1010 1100(사), 1110 1010 1011 0000 1001 1100(과)로 나타낼 수 있다.

UTF-8

유니코드 문자를 0과 1의 나열(바이너리 데이터)로 변환하기 위한 문자 인코딩 방식 중 하나이다. 이름 끝에 숫자 8이 있는 이유는, 최소 단위가 8비트이기 때문이다. 어떤 문자냐에 따라 1바이트 ~ 4바이트짜리 바이너리 데이터로 변환된다. 즉, 가변 길이 문자 인코딩이다. 예를 들어, 위 예시의 사과는 두 글자 모두 각각 3바이트(24비트)로 변환되었다.

ASCII 인코딩은 UTF-8의 부분 집합이다. 일반적인 ASCII 문자열은 올바른 UTF-8 문자열이며, 따라서 하위 호환성이 보장된다.

Base64

바이너리 데이터를 문자로 바꾸는 인코딩이며, 결과물은 ASCII 문자로만 이루어진다. Base64라는 이름의 의미는 64진법(=6비트)인데, 어떤 문자와 기호로 64개를 구성하느냐에 따라 여러 변종이 있지만 잘 알려진 것은 처음 62개는 알파벳 A-Z, a-z와 숫자 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다. 전자 메일 Base64는 알파벳 대소문자와 숫자, 그리고 +, / 기호 64개로 이루어지며, =는 끝을 알리는 코드로 쓰인다.

Base64 색인표
문자 문자 문자 문자
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

즉, Base64 인코딩은 바이너리 데이터를 6비트씩 파싱하여 대응되는 문자로 치환하는 인코딩이다. 예를 들어, Man을 변환하는 과정은 다음과 같다.

M은 ASCII(=UTF-8) 바이너리로 표현하면 01001101이고, 십진법으로 77이다. 위 예시의 경우 8비트 버퍼에 각 문자의 바이너리 데이터를 넣고, 앞에서부터 6비트씩 파싱하여 인덱스를 구하고, 그 인덱스에 대응되는 문자를 Base64 색인표에서 찾은 것이다.

Base64 인코딩은 24비트를 6비트씩 4개로 나누는 과정을 필요로 하는데, 만약 M 한글자만 인코딩할 경우엔 M이 차지하는 8비트를 제외한 나머지 16비트는 0으로 채운다.

즉, M 한글자를 Base64 인코딩하면 TQAA가... 되지 않는다. 왜냐하면 입력 데이터의 길이에 따른 패딩 규칙이 있기 때문이다. 패딩은 문자 =을 사용하며, 패딩 규칙은 다음과 같다.

  • 입력 데이터의 길이가 1바이트: 결과는 XX== (2개의 패딩 문자)
  • 입력 데이터의 길이가 2바이트: 결과는 XXX= (1개의 패딩 문자)
  • 입력 데이터의 길이가 3바이트: 결과는 XXXX (패딩 없음)

따라서, 최종 결과는 TQ==가 된다.

사실 위 예시들에서 Base64로 인코딩하는 과정에서 이미 UTF-8 인코딩도 함께 수행한 셈이다. 'Man' 또는 'M'이라는 문자를 바이너리 데이터로 변환해야 Base64 인코딩을 할 수 있기 때문이다.

정리

정리하면, 다음과 같다.

UTF-8 인코딩

  • 입력: 문자 ("Man")
  • 출력: 바이너리 (01001101 01100001 01101110)

Base64 인코딩

  • 입력: 바이너리 (01001101 01100001 01101110)
  • 출력: 문자 ("TWFu")
profile
앱 개발자를 꿈꾸는.. 제조업 직원.. @_@

0개의 댓글