「illegal base64 character」エラーの原因と直し方
illegal base64 character 5f や illegal base64 character 7b は、入力に標準Base64で使えない文字があるという意味です。 末尾の値は、多くの場合、問題の文字を表す16進数です。「base64 使えない文字」「base64 禁止文字」「base64 禁則文字」を整理して直し方を解説します。
An illegal base64 charactererror means the input contains a character outside the decoder's alphabet. The hexadecimal suffix often identifies it.
TL;DR
- 標準Base64の使用可能文字は
A-Z a-z 0-9 + /と末尾の=のみ 5f(_)はURL-safe版、7b({)はJSON混入を疑う- 接頭辞・空白・改行を除去し、入力形式に合うデコーダーで再試行する
1. Base64の使用可能文字 / Allowed characters
標準Base64が使うのは A-Z、a-z、0-9、+、/ の64文字です。= は末尾のパディング専用です。それ以外のスペース、改行、日本語、全角文字、記号が混入するとエラーになります。
標準 Base64: A-Z a-z 0-9 + / (= は末尾のみ)
URL-safe Base64: A-Z a-z 0-9 - _ (= は省略可能)
↑ ↑
+ と / の置き換え2. 5c・5f・7b・5bは何を表すか / Hex codes
illegal base64 character 5c はバックスラッシュ、illegal base64 character 5f はアンダースコアです。 RFC 4648 Section 5 のURL-safe Base64は、標準版の + を -、/ を _ に置き換えます。
| コード | 文字 | 典型的な原因 |
|---|---|---|
5c | \ | JSONのエスケープやWindowsパスが混入 |
5f | _ | URL-safe Base64を標準デコーダーへ渡した |
7b | { | JSONオブジェクト全体を渡した |
5b | [ | JSON配列全体を渡した |
_ はURL-safe版では正しくても標準デコーダーには禁止文字です。{ や [ はどちらにも含まれず、JSON文字列・配列をそのまま渡した典型例です。
3. エラー原因の切り分け / Troubleshooting table
| 症状・入力 | 原因 | 対処 |
|---|---|---|
| 長い値のコピペで失敗 | 自動改行されたCR/LFが混入 | 空白と改行を除去 |
- や _ がある | URL-safe版を標準デコーダーへ入力 | URL-safe対応で復号する |
data:image/png;base64, で始まる | Data URI接頭辞を含めている | 最初のカンマまでを除去 |
| 見た目は正しいのに失敗 | 全角スペースなど文字化けしたコピー | 不可視文字を確認して再コピー |
4. 入力を正規化して直す / Normalize the input
まず不要な接頭辞、空白、タブ、改行を除去します。URL-safe版なら対応デコーダーを使うか、-_ を +/ に戻し、長さが4の倍数になるよう = を補います。
function normalizeBase64(input) {
const body = input.replace(/^data:[^,]*;base64,/i, "").replace(/\s/g, "");
const standard = body.replace(/-/g, "+").replace(/_/g, "/");
const remainder = standard.length % 4;
return remainder ? standard + "=".repeat(4 - remainder) : standard;
}
const decoded = atob(normalizeBase64(input));当サイトの Base64 Encoder / Decoder は通常のBase64とURL-safe Base64の両方に対応しています。 入力形式を選び、まず不要な接頭辞・空白・改行を除去してから再試行してください。
どの言語・環境でこのエラーが出るか / Where this message comes from
illegal base64 characterという文言そのものは、多くの場合Javaのjava.util.Base64.getDecoder()が 投げるIllegalArgumentException: Illegal base64 character 3cのような例外メッセージに由来します。 同じ問題でも言語・実行環境によってメッセージや挙動は異なります。
| 言語・環境 / Language | 不正文字が混入した場合の挙動 |
|---|---|
Java (java.util.Base64) | IllegalArgumentException: Illegal base64 character 3cのように例外を投げて停止する |
ブラウザ (atob()) | DOMException: The string to be decoded is not correctly encoded.で例外を投げる |
Python (base64.b64decode) | 既定(validate=False)では不正文字を黙って無視して復号を続ける。validate=Trueを指定して初めて例外になる |
Node.js (Buffer.from(str, "base64")) | 例外を投げず、不正文字を無視して途中まで復号された結果を返す(サイレントに壊れる) |
Go (encoding/base64) | illegal base64 data at input byte Nとバイト位置付きのエラーを返す |
PythonやNode.jsは既定では例外を投げずに不正文字を無視するため、「エラーは出ないのに結果が壊れている」場合は これらの環境を疑ってください。厳密に検証したい場合はPythonならvalidate=Trueを明示します。
メール由来のBase64(76文字改行)に注意 / MIME line-wrapped Base64
メール添付(RFC 2045 MIME)のBase64は76文字ごとにCRLFで改行される仕様です。この改行自体は正しい仕様ですが、 改行を除去しない前提の厳密なデコーダーにそのまま貼り付けると、改行文字が不正文字として扱われることがあります。 本記事の「入力を正規化して直す」で示した通り、改行・空白を一律で除去してから復号すればこの種のエラーは回避できます。
5. English summary
Standard Base64 accepts only A-Z, a-z, 0-9, +, /, plus trailing = padding. Hex 5c is a backslash, 5f an underscore, 7b an opening brace, and 5b an opening bracket. An underscore usually indicates Base64URL; braces or brackets usually mean JSON was passed instead of its Base64 field. Strip Data URI prefixes and whitespace, then use the matching decoder.