Base64를 UTF-8로 디코딩하는 방법
- 입력 · Base64에 Base64를 붙여넣으세요. 문자 인코딩은 UTF-8로 미리 설정되어 있습니다.
- 출력 · 텍스트에서 결과를 읽으세요. 상태 표시줄에 바이트 수와 감지된 내용 유형이 나타납니다.
- 상태 표시줄에 “일부 바이트가 올바른 UTF-8이 아닙니다"라고 나오면 텍스트가 다른 문자 인코딩입니다. 자동 감지, Windows-1252, UTF-16LE를 시도하고, 한글이 깨진다면 EUC-KR을 선택해 보세요.
- 출력 복사는 텍스트를 복사하고, 다운로드는 디코딩된 바이트를 그대로 저장합니다.
반대 방향으로 인코딩하려면 UTF-8을 Base64로를 사용하세요.
예시
| Base64 | UTF-8로 디코딩한 결과 | 보여 주는 것 |
|---|---|---|
8J+YgA== | 😀 | 이모지 하나, 4바이트 |
4oKs | € | 3바이트, 패딩 불필요 |
bmHDr3ZlIGNhZsOp | naïve café | 악센트 문자, 각 2바이트 |
77u/SGk= | Hi | 5바이트: 바이트 순서 표시 뒤에 Hi |
Y2Fm6Q== | caf� | E9는 Latin-1의 é이며 UTF-8에서는 잘못된 바이트 |
8J+Y | � | 4바이트 중 3바이트에서 잘린 이모지 |
Y2Fmw4PCqQ== | café | 이미 깨진 텍스트의 올바른 UTF-8 |
마지막 세 행은 아래에서 다루는 문제입니다. 잘못된 문자 인코딩, 잘린 문자열, 인코딩 전에 이미 깨진 텍스트입니다.
잘못된 UTF-8과 대체 문자
UTF-8에는 엄격한 규칙이 있습니다. 7F보다 큰 바이트는 정해진 패턴을 따르는 2, 3, 4바이트 시퀀스의 일부여야 합니다. 패턴을 깨는 바이트는 UTF-8로 읽을 수 없습니다. 디코더는 깨진 시퀀스를 하나씩 U+FFFD(�)로 바꾸고 “일부 바이트가 올바른 UTF-8이 아닙니다” 안내를 덧붙입니다. 아무것도 몰래 버리지 않으므로 � 하나하나가 문제가 있는 정확한 위치를 가리킵니다.
거의 모든 경우는 두 가지 원인 중 하나입니다.
- 다른 문자 인코딩.
Y2Fm6Q==에는63 61 66 E9가 들어 있는데, ISO-8859-1과 Windows-1252에서는café입니다. 문자 인코딩을 바꾸면 텍스트가 나타납니다. 한글 텍스트가 깨진다면 EUC-KR로 저장된 데이터일 수 있습니다. Base64 디코딩 페이지에 문자 인코딩별 흔한 증상이 정리되어 있습니다. - 잘린 문자열. 데이터베이스의 열 길이 제한이나 로그 한 줄 길이 때문에 Base64가 잘리면 마지막 문자의 바이트 일부가 사라질 수 있습니다.
8J+YgA==는 완전한 이모지이고,8J+Y는 같은 이모지에서 마지막 바이트가 빠진 것이라�하나로 디코딩됩니다. 원본에서 전체 값을 찾아보세요.
이중 인코딩된 텍스트 (é와 ’)
출력에 é 대신 é, ü 대신 ü, 둥근 아포스트로피 대신 ’가 보인다면 디코더 잘못이 아닙니다. 이전 어딘가에서 UTF-8 바이트를 Windows-1252로 읽은 뒤 다시 UTF-8로 저장하면서 특수 문자 하나가 엉뚱한 문자 두세 개로 바뀐 것입니다. Base64는 그 손상된 텍스트를 충실히 담고 있을 뿐입니다. Y2Fmw4PCqQ==는 7바이트 문자열 café의 올바른 UTF-8입니다.
이런 문자열은 실수를 거꾸로 되돌려 코드로 복구할 수 있는 경우가 많습니다. 텍스트를 Windows-1252로 인코딩한 다음 그 바이트를 UTF-8로 디코딩하면 됩니다. 근본적인 해결은 데이터를 기록한 시스템에서 해야 합니다.
바이트 순서 표시
일부 편집기, 특히 Windows의 편집기는 UTF-8 파일 맨 앞에 바이트 순서 표시인 EF BB BF를 넣습니다. 그러면 Base64로는 파일이 77u/로 시작합니다. 디코더는 이 표시를 알아보고 텍스트에서 빼지만, 다운로드는 바이트를 원래대로 유지합니다. 코드에서는 직접 제거해야 할 수도 있습니다.
import base64
raw = base64.b64decode("77u/SGk=")
raw.decode("utf-8") # '\ufeffHi'
raw.decode("utf-8-sig") # 'Hi'
base64.b64decode("Y2Fm6Q==").decode("utf-8", errors="replace") # 'caf�'
errors="replace"가 없으면 Python은 잘못된 바이트에서 UnicodeDecodeError를 발생시킵니다. JavaScript에서 new TextDecoder("utf-8", { fatal: true })는 �를 넣는 대신 TypeError를 던지며, 기본 디코더는 이 도구처럼 BOM을 제거합니다. 자세한 내용은 Python에서 Base64와 JavaScript에서 Base64에 있습니다.
자주 묻는 질문
Base64를 UTF-8 문자열로 디코딩하려면 어떻게 하나요?
Base64를 바이트로 디코딩한 다음 그 바이트를 UTF-8로 해석합니다. 위 도구는 이 과정을 한 번에 처리합니다. Python에서는 base64.b64decode(s).decode("utf-8"), 브라우저에서는 new TextDecoder().decode(bytes)입니다.
출력에 나오는 � 문자는 무슨 뜻인가요?
U+FFFD, 대체 문자입니다. 디코더는 바이트가 올바른 UTF-8을 이루지 못하는 곳마다 이 문자를 넣습니다. 대개 텍스트가 다른 문자 인코딩으로 저장되었거나 Base64가 잘렸다는 뜻입니다.
디코딩한 텍스트 맨 앞에 보이지 않는 문자가 있는 이유는 무엇인가요?
원본에 UTF-8 바이트 순서 표시(BOM)가 있었을 가능성이 높습니다(Base64가 77u/로 시작). 이 도구는 BOM을 제거하지만, Python의 일반 .decode("utf-8")는 \ufeff로 남겨 둡니다. 제거하려면 "utf-8-sig"를 쓰세요.
내 Base64에는 UTF-8을 선택하면 되나요?
대부분 그렇습니다. JSON, 웹, Linux, 최신 API는 모두 UTF-8을 씁니다. 오래된 Windows 프로그램이나 .NET, PowerShell 문자열에서 온 데이터는 Windows-125x나 UTF-16일 수 있고, 한국어 레거시 시스템의 데이터는 EUC-KR일 수 있습니다.