Base64
Base64でよくあるエラーと対処法|私が詰んだ3つのケース
2025-11-03
:::note ※Base64でエラーが出た人向けの「トラブルシューティング」記事です :::
結論(私の判断基準)
- 「無効なBase64」エラー → 改行・空白が混入している
- 文字化け → バイナリをテキストとしてデコードした
- 画像が表示されない → MIMEタイプが間違っている
私はこの3つで何度も詰んだ。
🚀 今すぐ変換 → Base64エンコーダー
私が詰んだケース1:改行が混入していた
APIからBase64文字列を受け取っていた。ある日、デコードに失敗するようになった。
「無効なBase64文字列です」というエラー。
原因を探した。3時間かかった。Base64文字列の途中に改行が入っていた。
どこかの処理で、長い文字列を改行区切りにしていた。Base64で使えるのは A-Z, a-z, 0-9, +, /, = のみ。改行は使えない。
// ❌ 改行が入っている
const base64 = "iVBORw0KGgo...\n...AAASUVORK5CYII=";
// ✅ 改行を除去
const cleaned = base64.replace(/[\r\n]/g, '');
Base64エラーが出たら、まず改行・空白を疑う。
私が詰んだケース2:バイナリをテキストとしてデコードした
画像のBase64をデコードした。文字化けした。
当たり前だった。画像はバイナリ。テキストとしてデコードしたら文字化けする。
// ❌ テキストとしてデコード(文字化けする)
const text = atob(imageBase64);
// ✅ バイナリとして扱う
const binary = atob(imageBase64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
バイナリデータはデコード後にファイルとして保存する。テキストとして扱わない。
私が詰んだケース3:MIMEタイプを間違えた
PNGファイルをBase64化してHTMLに埋め込んだ。表示されない。
<!-- ❌ MIMEタイプが間違っている -->
<img src="data:image/jpeg;base64,iVBORw0KGgo...">
<!-- ✅ PNGならimage/png -->
<img src="data:image/png;base64,iVBORw0KGgo...">
**PNGなのに image/jpeg を指定していた。**ファイル形式に合ったMIMEタイプを使う。
JavaScriptの atob() でエラーが出る
atob("日本語") // Error: Invalid character
atob() はASCII文字列しか扱えない。日本語を含む場合はUTF-8エンコードが必要。
// エンコード(日本語対応)
const encoded = btoa(unescape(encodeURIComponent("日本語")));
// デコード(日本語対応)
const decoded = decodeURIComponent(escape(atob(encoded)));
日本語を含むならこの方法。覚えておく。
エンコード結果が長すぎる
Base64は元データより約33%大きくなる。これは仕様。
| 元サイズ | Base64後 |
|---|---|
| 75KB | 約100KB |
| 750KB | 約1MB |
大きいファイルはBase64化しない方がいい。私は10MBの画像をBase64化してタイムアウトした。
迷ったときの判断
| エラー | まず確認すること |
|---|---|
| 無効なBase64 | 改行・空白が混入していないか |
| 文字化け | バイナリをテキストとしてデコードしていないか |
| 画像が表示されない | MIMEタイプが正しいか |
| atobでエラー | 日本語が含まれていないか |
この記事で解決しない場合
- サイズの目安を知りたい → Base64埋め込みのサイズ目安
- Base64の思想を知りたい → Base64は本来、使うべき技術ではない
Base64のエラーは原因が分かりにくい。改行・空白・MIMEタイプ。この3つをまず疑う。