UTF-8은 가변길이 문자 인코딩 중 하나로 유니코드 문자를 1에서 4바이트로 표현합니다.
아스키와 호환성을 갖습니다.
아래 링크에서 각 문자의 유니코드 코드 포인트를 확인할 수 있습니다.
완성형 한글의 유니코드 포인트는 AC00에서 D7AF입니다.
https://unicode-table.com/en/blocks/
유니코드 코드 포인트를 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 |
---|