UTF-8

@Super_E끌림·2025년 10월 18일

🔍 개념

  • UTF = Unicode Transformation Format
  • 8 : 8bit 단위로 문자를 표현
  • 가변 길이 인코딩 : 문자에 따라 1~4byte까지 사용
  • 하위 호환성 : 아스키코드(미국 표준 문자 코드)와 완벽히 호환
  • 전 세계 언어(UNICODE)를 하나의 인코딩 방식으로 처리 가능

📎 관련 개념

  • UTF-16: 2바이트 또는 4바이트 사용, Windows 내부에서 많이 사용됨
  • UTF-32: 고정 4바이트 사용, 메모리 낭비가 큼
  • 인코딩(Encoding): 문자를 숫자(바이트)로 바꾸는 것
  • 디코딩(Decoding): 숫자를 문자로 되돌리는 것

📌 왜 UTF-8을 쓰는가?

  1. 전 세계 문자 지원 (한글, 일본어, 이모지 포함)
  2. ASCII와 호환 (기존 시스템과 충돌 없음)
  3. 효율적인 저장 (서양 알파벳은 1바이트만 사용)

UTF-8은 유니코드(Unicode)를 저장하거나 전송하기 위한 방식이고,
ASCII 코드도 유니코드의 일부이기 때문에 UTF-8로 자동 인코딩/디코딩이 가능하다.

🔁 유니코드, ASCII, UTF-8의 관계

  1. 유니코드(Unicode)는 "모든 문자"에 대해 고유한 번호(U+xxxx)를 부여한 문자 집합(표)이다.

    예) 'A' → U+0041'가' → U+AC00'😃' → U+1F603

  2. ASCII는 유니코드의 일부로, U+0000 ~ U+007F (0~127) 범위에 해당한다.

    • 예전 컴퓨터 시스템에서 쓰던 기본 문자셋
    • 'A' = 0x41'1' = 0x31'@' = 0x40 등
  3. UTF-8은 유니코드의 번호(U+xxxx)를 1~4바이트의 이진수(바이트)로 인코딩하는 방법입니다.

    • ASCII 범위(0~127)는 그대로 1바이트만 사용 → 호환성 보장!
    • 그 외 문자들은 자동으로 더 많은 바이트를 사용함 (예: 한글은 3바이트)

✔️ ASCII 문자인 'A'는 0x41

✔️ 한글 '가'는 0xEA 0xB0 0x80

✔️ 이모지 '😃'는 0xF0 0x9F 0x98 0x83로 인코딩된다.

💡예시

문자유니코드(U+xxxx)UTF-8 인코딩 (16진수)바이트 수
AU+0041411바이트
U+AC00EA B0 803바이트
😃U+1F603F0 9F 98 834바이트

⚙️ 작동 원리

UTF-8은 문자의 유니코드 값을 보고 아래처럼 바이트 수를 정합니다:

유니코드 범위바이트 수첫 바이트 시작 비트실제 데이터 비트 수 계산총 데이터 비트
0x0000 ~ 0x007F1바이트0xxxxxxx (ASCII)77
0x0080 ~ 0x07FF2바이트110xxxxx 10xxxxxx5 + 611
0x0800 ~ 0xFFFF3바이트1110xxxx 10xxxxxx 10xxxxxx4 + 6 + 616
0x10000 ~ 0x10FFFF4바이트11110xxx 10xxxxxx 10xxxxxx 10xxxxxx3 + 6 + 6 + 621

최대 6바이트까지 표현 가능하지만 다른 인코딩과 호환을 위해 4바이트까지만 사용한다.

첫 바이트의 1과0으로 채워진 bit는 시그니쳐로 생각하면 됩니다. 첫 바이트의 bit가 111000101 이렇게 되어 있으면 “3바이트를 사용하겠다!”라는 내용을 내포하고 있습니다. 그 뒤에 바이트 앞에 10으로 시작되면 중간에 존재하는 바이트라고 보시면 됩니다.

Ex) 문자 - 한 → U+D55C → 0xD55C : 1101 0101 0101 1100 → 3바이트 사용
11101101 10010101 10011100 → 0xED 0x95 0x9C

🔧 자동 인코딩/디코딩 예시 (파이썬)

# 파이썬 기본 문자열은 유니코드임
s = "A가😃"

# UTF-8로 인코딩 (문자 → 바이트)
encoded = s.encode('utf-8')
print(encoded)  # b'A\xea\xb0\x80\xf0\x9f\x98\x83'

# UTF-8로 디코딩 (바이트 → 문자)
decoded = encoded.decode('utf-8')
print(decoded)  # A가😃
profile
SoC:) SoC:)

0개의 댓글