UTF-8이란
컴퓨터의 모든 텍스트는 숫자로 저장됩니다. 유니코드(Unicode)는 각 문자에 코드 포인트라는 번호를 붙인 거대한 목록입니다. 글자 A는 U+0041, é는 U+00E9, 유로 기호 €는 U+20AC, 한글 가는 U+AC00입니다. UTF-8은 이 코드 포인트를 바이트로 바꾸는 규칙이고, UTF-8 인코딩 변환기는 그 결과를 눈으로 확인하게 해 줍니다.
UTF-8은 웹, JSON, 대부분의 프로그래밍 언어, 최신 운영체제의 표준 인코딩입니다. 가장 큰 장점은 일반 ASCII 텍스트가 바뀌지 않는다는 점입니다. A는 여전히 1바이트 41입니다. 다른 문자는 2, 3, 4바이트를 쓰며, 이 바이트들은 모두 128 이상이라 ASCII와 헷갈릴 일이 없습니다.
한국어 환경에서는 예전부터 쓰던 EUC-KR(CP949) 인코딩과 UTF-8이 섞여 글자가 깨지는 일이 많습니다. 이 도구는 UTF-8만 다룹니다. 한글 한 글자는 UTF-8로 항상 3바이트이고, EUC-KR에서는 2바이트입니다.
UTF-8 도구 사용 방법
인코딩. 텍스트 입력란에 입력하면 UTF-8 바이트 입력란에 바이트가 나타납니다. 복사를 눌러 가져가세요.
디코딩. UTF-8 바이트 입력란에 바이트를 붙여넣으면 왼쪽에 문자가 나타납니다. 붙여넣는 값에 맞게 바이트 형식을 맞춰야 합니다.
바이트 형식은 바이트를 쓰는 방법 여섯 가지를 제공합니다.
- 16진수 바이트: C3 A9: 읽고 디버깅할 때
- 이스케이프: \xC3\xA9: 코드의 문자열 리터럴에 넣을 때
- 퍼센트: %C3%A9: 웹 주소에서 쓰는 형식
- 10진수: 195 169: 바이트 배열용
- 2진수: 11000011 10101001: 비트 배치를 공부할 때
- 깨진 텍스트: é (글자 깨짐 복구): 잘못된 인코딩으로 읽혀 깨진 텍스트를 복구할 때
문자별 보기. 도구 아래의 표는 모든 문자를 코드 포인트, UTF-8 바이트, 바이트 수와 함께 보여 줍니다. 요약에는 전체 글자 수와 바이트 수가 나옵니다. 공백, 탭, 줄바꿈은 이름으로 표시되어 눈에 보입니다.
UTF-8의 작동 원리
바이트 수는 코드 포인트의 크기에 따라 정해집니다.
| 코드 포인트 | 바이트 | 비트 패턴 |
|---|---|---|
| U+0000 ~ U+007F | 1 | 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 |
첫 바이트가 뒤에 몇 바이트가 이어지는지 알려 주고, 뒤따르는 바이트는 모두 10으로 시작합니다. 그래서 UTF-8은 자기 동기화가 됩니다. 데이터 흐름의 중간에서 읽기 시작해도 프로그램이 다음 문자의 시작을 항상 찾을 수 있습니다.
한글 완성형 음절 11,172자는 U+AC00(가)부터 U+D7A3(힣)까지로, 모두 3바이트 구간에 들어갑니다. 그래서 가는 EA B0 80, 힣은 ED 9E A3입니다. 호환용 자모 ㄱ(U+3131)도 3바이트로 E3 84 B1입니다.
예시
| 문자 | 코드 포인트 | UTF-8 16진수 | 10진수 |
|---|---|---|---|
A |
U+0041 | 41 |
65 |
é |
U+00E9 | C3 A9 |
195 169 |
ñ |
U+00F1 | C3 B1 |
195 177 |
ß |
U+00DF | C3 9F |
195 159 |
€ |
U+20AC | E2 82 AC |
226 130 172 |
日 |
U+65E5 | E6 97 A5 |
230 151 165 |
| 엄지척 이모지 | U+1F44D | F0 9F 91 8D |
240 159 145 141 |
한글 단어 한글은 이 도구에서 다음과 같이 인코딩됩니다.
| 바이트 형식 | 결과 |
|---|---|
| 16진수 바이트 | ED 95 9C EA B8 80 |
| 이스케이프 | \xED\x95\x9C\xEA\xB8\x80 |
| 퍼센트 | %ED%95%9C%EA%B8%80 |
| 10진수 | 237 149 156 234 184 128 |
| 2진수 | 11101101 10010101 10011100 11101010 10111000 10000000 |
깨진 글자(모지바케) 복구
모지바케(mojibake)는 UTF-8 바이트를 Windows-1252나 Latin-1로 읽었을 때 생기는 뒤죽박죽 글자입니다. 바이트 하나하나가 각각 문자로 바뀌기 때문에 2바이트 글자는 이상한 기호 두 개가 됩니다.
| 올바른 텍스트 | 깨져 보이는 모습 |
|---|---|
café |
café |
naïve |
naïve |
It’s |
It’s |
€ |
€ |
깨진 텍스트 형식이 이 문제를 되돌립니다. 깨진 문자를 하나씩 원래 바이트로 되돌린 다음 UTF-8로 디코딩합니다. 이런 실수로는 생길 수 없는 문자가 섞여 있으면 추측하지 않고 그 사실을 알려 줍니다. 한글도 같은 방식으로 깨지면 복구됩니다. 예를 들어 한글을 붙여넣으면 한글이 됩니다. 다만 한글이 EUC-KR(CP949)과 UTF-8 사이에서 잘못 읽혀 깨진 경우는 이 기능이 다루는 Windows-1252 오류와 원인이 달라서 복구되지 않습니다.
팁과 한계
- 파일을 UTF-8로 저장하세요. 글자 깨짐은 대부분 한 인코딩으로 저장한 파일을 다른 인코딩으로 열면서 시작됩니다. 편집기에서 저장할 때 UTF-8을 고르세요.
- 인코딩을 선언하세요. HTML에서는 페이지 맨 위에
<meta charset="utf-8">을 넣습니다. - Excel과 CSV 파일. 예전 Excel은 CSV의 인코딩을 추측합니다. “CSV UTF-8” 형식으로 저장하면 악센트 문자나 한글이 깨지는 일을 막을 수 있습니다.
- 복구는 한 번에 한 단계입니다. 두 번 깨진 텍스트는 복구를 두 번 해야 합니다.
- 표는 최대 500자까지 보여 줍니다. 페이지를 빠르게 유지하기 위해서입니다. 바이트 수는 항상 텍스트 전체를 기준으로 셉니다.
다른 방법으로 인코딩하기
Python. 'café'.encode('utf-8')은 b'caf\xc3\xa9'를 돌려줍니다. 깨진 글자를 고치려면 'café'.encode('cp1252').decode('utf-8')을 실행하면 café가 나옵니다.
JavaScript. new TextEncoder().encode('é')는 바이트 195와 169를 돌려줍니다. new TextDecoder().decode(bytes)로 다시 문자로 바꿉니다.
명령줄. UTF-8 터미널에서 echo -n é | xxd를 실행하면 바이트 c3a9가 보입니다. 파일 전체를 바꿀 때는 iconv -f WINDOWS-1252 -t UTF-8을 씁니다.
관련 도구
일반 16진수 바이트를 디코딩하려면 16진수 텍스트 변환기를 쓰세요. 링크 속 퍼센트 인코딩 바이트는 URL 디코더가 처리합니다. 비트를 전부 보고 싶다면 2진수 변환기를 사용해 보세요.