UTF-8(Unicode Transformation Format – 8-bit)은 전자 통신에 사용되는 문자 인코딩 표준으로, 유니코드 표준(Unicode Standard)의 일부로 정의되어 있다. 이름에서 알 수 있듯 유니코드 문자를 8비트(1바이트) 단위의 가변 길이 인코딩 방식으로 변환하는 형식이다.
UTF-8은 유니코드의 모든 1,112,064개 유효 코드 포인트를 1바이트에서 최대 4바이트까지의 가변 길이로 표현한다. 숫자 값이 작은 코드 포인트(빈도가 높은 문자)일수록 더 적은 바이트로 인코딩된다. 특히 ASCII 문자(0x00~0x7F)와 완전히 호환되어, ASCII 문자만으로 구성된 파일은 UTF-8 파일과 동일한 바이트 값을 가진다.
기술적 특징
UTF-8의 인코딩 구조는 다음과 같다:
- U+0000 ~ U+007F: 1바이트 (ASCII와 동일, 0xxxxxxx)
- U+0080 ~ U+07FF: 2바이트 (110xxxxx 10xxxxxx)
- U+0800 ~ U+FFFF: 3바이트 (1110xxxx 10xxxxxx 10xxxxxx)
- U+10000 ~ U+10FFFF: 4바이트 (11110xxx 10xxxxxx 10xxxxxx 10xxxxxx)
이 구조는 프리픽스 코드(prefix code)로서, 코드 포인트의 마지막 바이트까지 읽지 않아도 디코딩이 가능하며, 자기 동기화(self-synchronizing) 특성을 가져 임의의 위치에서도 최대 3바이트만 되돌아가면 문자 경계를 찾을 수 있다.
역사
UTF-8의 전신은 1992년 X/Open 위원회 XoJIG에서 논의된 FSS-UTF(File System Safe UCS Transformation Format)이다. 데이브 프로서(Dave Prosser)가 초안을 제출했고, 이후 벨 연구소(Bell Labs)의 켄 톰프슨(Ken Thompson)이 자기 동기화 기능을 추가한 수정안을 제시했다. 1992년 9월 2일, 톰프슨과 롭 파이크(Rob Pike)가 뉴저지의 한 식당에서 냅킨에 설계를 구상한 일화로 유명하다. 이후 Plan 9 운영체제에 전면 도입되었고, 1993년 USENIX 학술 대회에서 공식 발표되었다.
초기 UTF-8 표준(RFC 2279)은 최대 6바이트로 31비트까지 인코딩할 수 있었으나, 2003년 RFC 3629에서 UTF-16의 제약과 일치하도록 U+10FFFF까지만 허용하고 4바이트로 제한되었다.
현황과 채택
2008년 이후 UTF-8은 월드 와이드 웹에서 가장 보편적인 문자 인코딩이 되었다. 2026년 기준으로 조사된 웹사이트의 약 99.0%가 UTF-8을 사용하고 있다. JSON, HTML, XML, DOM 등 주요 웹 표준에서 UTF-8을 필수 또는 기본 인코딩으로 지정하고 있다.
대부분의 현대 운영체제와 프로그래밍 언어는 UTF-8을 지원한다. Go, Julia, Rust, Swift(5.0 이후)는 내부 문자열 표현에 UTF-8을 사용한다. 마이크로소프트는 2019년 Windows API에서 UTF-8을 코드 페이지로 설정할 수 있는 기능을 추가했으며, 이후 개발자에게 UTF-8 사용을 권장하고 있다.
표준 명칭
공식 명칭은 UTF-8로, 하이픈(-)이 필수이며 공백이 허용되지 않는다. 웹 표준에서는 대소문자를 구분하지 않으며 utf-8도 널리 사용된다. Windows에서는 코드 페이지 번호 65001(CP_UTF8)로 식별된다. MySQL에서는 utf8mb4가 UTF-8을 의미하며, utf8은 구형 CESU-8 변형을 가리킨다.
오류 처리
모든 바이트 열이 유효한 UTF-8인 것은 아니다. 연속 바이트(0x80~0xBF)가 문자 시작에 오는 경우, 과잉 인코딩(overlong encoding)된 경우, U+10FFFF를 초과하는 값으로 디코딩되는 경우 등은 오류로 처리되어야 한다. 현대의 UTF-8 디코더는 일반적으로 오류 발생 시 U+FFFD(REPLACEMENT CHARACTER)로 대체하고 디코딩을 계속한다.