TL;DR

  • UTF-8은 유니코드 코드 포인트 범위(U+0000부터 U+10FFFF까지) 중 surrogate code point range (U+D800부터U+DFFF까지)를 제외한 유효한 코드 포인트, 즉 Unicode Scalar Value를 1~4바이트 가변 길이로 인코딩하는 방식이다.
  • ASCII와 완전한 하위 호환성을 가지며, 바이트 순서(Endianness) 문제가 없는 설계로 현대 컴퓨팅의 표준 인코딩으로 자리 잡았다.

UTF-8 (Unicode Transformation Format - 8-bit)

1. 유니코드와 인코딩의 관계

  • 유니코드 (Unicode): 전 세계 문자에 고유 정수값(코드 포인트)을 부여한 논리적 집합이다.
  • UTF-8: 코드 포인트를 컴퓨터 메모리에 저장하거나 네트워크로 전송하기 위해 물리적 바이트열로 변환하는 규격이다.
구분유니코드 (U+XXXX)UTF-8 (0xXX…)
역할문자의 고유 식별 번호데이터의 저장·전송 형태
단위코드 포인트 / Unicode Scalar Value8비트 코드 단위 (Code Unit)

2. 가변 길이 인코딩 구조

유니코드 코드 포인트 크기에 따라 사용 바이트가 결정되며, 각 바이트의 접두어 비트(Prefix)를 통해 문자의 경계를 식별한다.

유니코드 범위 (Hex)바이트 수비트 패턴 (x = 데이터 비트)유효 비트비고
U+0000부터 U+007F까지10xxxxxxx7ASCII 동일
U+0080부터 U+07FF까지2110xxxxx 10xxxxxx11라틴 문자 등
U+0800부터 U+FFFF까지31110xxxx 10xxxxxx 10xxxxxx16한글, 중문 등
U+10000부터 U+10FFFF까지411110xxx 10xxxxxx 10xxxxxx 10xxxxxx21이모지 등

RFC 3629 준수

UTF-8은 UTF-16의 Surrogate Pair 범위(U+D800부터 U+DFFF까지)를 직접 인코딩하는 것을 금지하여 상호 변환 시의 일관성을 보장한다.


3. 상세 인코딩 사례 (비트 연산)

한글 ‘가’ (U+AC00)

  1. 코드 포인트: U+AC00 → 이진수 1010 1100 0000 0000
  2. 패턴 판정: 3바이트 패턴(1110xxxx 10xxxxxx 10xxxxxx) 적용
  3. 비트 배치:
    • 11101010 (0xEA)
    • 10110000 (0xB0)
    • 10000000 (0x80)
  4. 결과: 0xEA 0xB0 0x80

이모지 ’😀’ (U+1F600)

  1. 코드 포인트: U+1F600 → 이진수 1 1111 0110 0000 0000
  2. 패턴 판정: 4바이트 패턴(11110xxx 10xxxxxx 10xxxxxx 10xxxxxx) 적용
  3. 비트 배치:
    • 11110000 (0xF0)
    • 10011111 (0x9F)
    • 10011000 (0x98)
    • 10000000 (0x80)
  4. 결과: 0xF0 0x9F 0x98 0x80

4. 기술적 강점

자기 동기화 (Self-synchronizing)

첫 바이트와 후속 바이트의 비트 패턴이 명확히 구분되어, 데이터 중간부터 읽기 시작하더라도 가까운 문자 경계를 쉽게 다시 찾을 수 있다.

엔디언 독립성 (Endianness Independent)

UTF-8은 8비트 코드 단위의 바이트열로 정의되므로 CPU 아키텍처(Little/Big Endian)에 따른 바이트 순서 교환이 필요하지 않다. 따라서 UTF-16/UTF-32와 달리 바이트 순서 판별 목적의 BOM(Byte Order Mark)은 필요하지 않다. 다만 UTF-8 BOM(EF BB BF)은 U+FEFF를 UTF-8로 인코딩한 바이트열로, 인코딩 식별용 서명으로 존재할 수 있다.


Connections