UTF-8은 가변길이 문자 인코딩 중 하나로 유니코드 문자를 1에서 4바이트로 표현합니다.

아스키와 호환성을 갖습니다.

 

아래 링크에서 각 문자의 유니코드 코드 포인트를 확인할 수 있습니다.

완성형 한글의 유니코드 포인트는 AC00에서 D7AF입니다.

https://unicode-table.com/en/blocks/

 

Unicode

Unicode web service for character search. Find, copy and paste your favorite characters: 😎 Emoji, ❤ Hearts, 💲 Currencies, → Arrows, ★ Stars and many others 🚩

unicode-table.com

유니코드 코드 포인트를 UTF-8으로 인코딩 하는 방법

1. 유니코드 코드포인트를 이진수로 변경합니다.

    이진수 길이에 따라 인코딩 바이트 수 결정

비트 수 UTF-8 바이트 수
1~7비트 1바이트(아스키와 같음)
8~11비트 2바이트
12~16비트 3바이트
16~21비트 4바이트

아스키문자의 경우 UTF-8 인코딩과 같습니다.

 

2. 각 바이트 길이에서 패딩을 제외한 부분에 비트 값을 덮어 씁니다.

    바이트 길이에 따라 맨 앞의 바이트에는 바이트길이를 나타내는 패딩 비트들이 있습니다.

    2바이트 이상인 경우 두 번째 바이트부터는 맨 앞에 비트값 '10'이 붙습니다.

바이트 길이 패딩 값
1바이트 0*******
2바이트 110***** 10******
3바이트 1110**** 10****** 10******
4바이트 11110*** 10****** 10****** 10******

 

한글 '가'의 UTF-8 바이트 값 확인해보기

'가'의 유니코드 코드 포인트는 16진수로 0xAC00, 10진수로 44032입니다.

이를 이진수로 표현하면 '1010110000000000'인데, 길이가 16비트 이므로 utf-8로 3바이트입니다.

3바이트에 이진수 값들을 덮어 쓰면 11101010 10110000 10000000 입니다.

 

이를 파이썬 코드로 다음과 같이 확인할 수 있습니다.

str = '가'

encoded = str.encode('utf-8') # 기본 인코딩이 utf-8
print(len(encoded)) # 인코딩 길이 출력
# 3
for val in encoded: # 인코딩 값 이진수로 출력
	print(val, bin(val))
# 234 0b11101010
# 176 0b10110000
# 128 0b10000000

이진수 값이 먼저 계산한 값과 같습니다.

이번에는 반대로 바이트 배열을 UTF-8로 디코드 하여 str으로 읽어보겠습니다.

utf8_bytes = bytes([234, 176, 128])
str = utf8_bytes.decode('utf-8')

print(str) # 가

'기타' 카테고리의 다른 글

base64 파이썬으로 구현하기  (0) 2022.07.14

+ Recent posts