Base64 をデコードする手順
- Base64 を 入力 · Base64 のボックスに貼り付けます。改行、空白、前後の引用符、
data:...;base64,の接頭辞は付いたままでかまいません。デコーダーが取り除きます。 - デコードしたテキストが 出力 · テキスト に表示されます。ステータス行には 有効な Base64、バリアント(Standard または Base64URL)、デコード後のバイト数が表示され、推定形式 には検出した内容の種類が出ます。
- テキストが文字化けしている場合は、文字コード を変えるか 自動検出 を選びます。
- 内容が JSON なら、JSON を整形 でインデントして読みやすくできます。
- 出力をコピー を押すか、ダウンロード でデコードしたバイト列をファイルとして保存します。拡張子は検出した種類に従うので、JSON は
decoded.json、PNG はdecoded.pngとして保存されます。
入れ替え を押すと、デコードしたテキストが入力欄に戻り、エンコードに切り替わります。文字列が往復で元に戻るかを手早く確かめられます。
デコーダーが受け付けるもの
Base64 がきれいな形で届くことはまれです。メールからは 76 文字で折り返され、JSON ファイルからは引用符付きで、URL からはパーセントエンコードされて、トークンからはパディングなしでやって来ます。デコーダーは、設定なしでこれらすべてを受け付けます。
| 貼り付けたもの | 得られる結果 | 何が起きたか |
|---|---|---|
SGVsbG8gV29ybGQ | Hello World | 不足していた = を補い、ステータス行でその旨を表示 |
8J-Riw | 👋 | URL セーフの - と _ を認識し、バリアントを Base64URL と表示 |
data:text/plain;base64,SGk= | Hi | data URI の接頭辞を除去 |
"SGVsbG8=" | Hello | コードや JSON 由来の引用符を除去 |
SGVsbG8%3D | Hello | URL エンコードされた %3D を = として読み取り |
SGVs(改行)bG8= | Hello | 改行と空白を読み飛ばし |
デコーダーはこうした包み方の違いには寛容で、それ以外には厳格です。アルファベット以外の文字があると、その文字と位置を示すエラーを出して止まります。ライブラリによっては不正な文字を黙って読み飛ばし、壊れた出力を返すものもあります(下のコードのセクションを参照)。
URL セーフなトークンについては、Base64URL デコーダー でアルファベットを、Base64 と Base64URL の違い で両者の違いを説明しています。
デコードした Base64 がファイルだった場合
Base64 はどんなバイト列でも運べるため、画像や文書を表す Base64 文字列も多くあります。ツールはデコードしたデータの先頭バイトを既知のファイルシグネチャ(マジックナンバー)と照合し、結果を 推定形式 として表示します。PNG、JPEG、PDF、ZIP、gzip、JSON、XML などです。バイナリ形式の場合は印字可能な部分のプレビューを表示し、バイナリデータであることを示して、Base64 から画像へ や Base64 から PDF へ など適切なツールへのリンクを出します。どちらの場合も、ダウンロード では元のバイト列を保存します。
Base64 文字列の先頭を見れば、デコードする前に形式がわかることもよくあります。
| Base64 の先頭 | デコード後のバイト | 形式 |
|---|---|---|
iVBORw0KGgo | 89 50 4E 47 0D 0A 1A 0A | PNG 画像 |
/9j/ | FF D8 FF | JPEG 画像 |
JVBERi0 | %PDF- | PDF 文書 |
UEsDBA | PK 03 04 | ZIP、DOCX や XLSX も |
H4sI | 1F 8B 08 | gzip データ(gzip Base64 デコーダー) |
eyJ | {" | JSON、多くは JWT のセグメント |
PD94bWwg | <?xml | XML |
ほかのシグネチャは よく見る Base64 の接頭辞 に一覧があります。種類のわからないファイルなら、Base64 からファイルへ が形式を判定してプレビューします。
文字コード:文字化けを直す
Base64 が保存しているのはバイト列で、どの文字コードで文字をバイト列にしたかについては何も語りません。デコーダーは UTF-8 を前提にしており、最近のデータのほとんどではそれで正解です。間違っている場合は、見てわかる症状が出ます。
�が表示され、「一部のバイトが UTF-8 として不正です」と注意が出る。 テキストは従来の文字コードで書かれています。Y2Fm6Q==は UTF-8 ではcaf�、ISO-8859-1 や Windows-1252 ではcaféと読めます。z/Do4uXyのようなロシア語のテキストは、Windows-1251 でПриветと表示されます。日本語のテキストなら Shift_JIS や EUC-JP を試してください。- 1 文字ごとにドットや隙間が入る。 UTF-16 で、ASCII の文字の後ろにゼロバイトが続いています。
SABlAGwAbABvAA==は UTF-16LE でHelloです(Base64 から UTF-16 へ)。 - 出力に
é、ü、’が出る。 デコード自体は正しく行われています。Base64 にされる前に、どこかの処理が UTF-8 を Latin-1 と誤読し、その結果を UTF-8 で保存し直したため、テキストが二重エンコードされていたのです。Y2Fmw4PCqQ==はまさにcaféにデコードされます。元のデータの側で直してください。
自動検出 は、まずバイト順マークを確認し、次にバイト列が UTF-8 として有効かを、さらに UTF-16 のゼロバイトのパターンを調べます。Windows-1251 や KOI8-R のような 1 バイトのコードページはどんな検出器にも同じように見えるので、元のデータがわかっているなら手動で選んでください。
エラーメッセージとその意味
| メッセージ | よくある原因 | 対処 |
|---|---|---|
| 位置 21 に無効な文字 . があります | JWT をまるごと貼り付けた。ドットは 3 つのセグメントの区切り | セグメントを 1 つだけデコードするか、JWT デコーダー を使う |
位置 8 に無効な文字 "\\" があります | / が \/ とエスケープされた JSON から Base64 をコピーした | \/ を / に置き換える |
| 標準(+ /)と URLセーフ(- _)の文字が混在しています | 2 つの文字列がつながったか、変換が中途半端 | Base64URL から Base64 へ でどちらか一方のアルファベットに変換する |
| パディング(=)は末尾にしか置けません | SGk=SGk= のように 2 つの Base64 の値がくっついている | 分割してそれぞれデコードする |
| 長さが不正です。1 文字多いか少ないようです | コピーで文字が欠けたか増えた | コピーし直すか、Base64 の修復 を試す |
それぞれのケースは Base64 のエラーガイド で詳しく説明しています。文字列のどの文字やパディングに問題があるのかを突き止めるには、Base64 バリデーター を使ってください。
JavaScript、Python、コマンドラインでの Base64 デコード
atob() は 1 バイトにつき 1 文字の「バイナリ文字列」を返すので、UTF-8 のテキストには TextDecoder の手順が必要です。atob はパディングの欠落は受け付けますが、URL セーフの - と _ には InvalidCharacterError を投げます。
const s = "R3LDvMOfZSDwn5GL";
new TextDecoder().decode(Uint8Array.from(atob(s), c => c.charCodeAt(0)));
// "Grüße 👋"
// Node.js accepts both alphabets
Buffer.from(s, "base64").toString("utf8"); // "Grüße 👋"
Buffer.from("8J-Riw", "base64url").toString("utf8"); // "👋"
Python はパディングのない入力に binascii.Error: Incorrect padding を送出するので、パディングは自分で補います。
import base64
s = "SGVsbG8"
base64.b64decode(s + "=" * (-len(s) % 4)).decode("utf-8")
# 'Hello'
base64.b64decode("SGVs*bG8=", validate=True)
# binascii.Error: Only base64 data is allowed
validate=True を付けないと、Python は * を捨てて b'Hello' を返します。Node の Buffer.from も同じ振る舞いをするので、壊れた文字列がエラーなしでデコードされてしまうことがあります。
コマンドラインでは次のとおりです。
printf '%s' 'R3LDvMOfZSDwn5GL' | base64 -d
base64 -d message.b64 > message.bin
1 行目は Grüße 👋 を出力します。古い macOS ではフラグが -D です。言語ごとの詳細:JavaScript、Node.js、Python、PHP。
よくある質問
Base64 文字列をデコードするには?
上の入力欄に貼り付けるだけで、デコードしたテキストがすぐに表示されます。コードでは Base64 をバイト列にデコードし、そのバイト列を UTF-8 として読みます。Python なら base64.b64decode(s).decode()、Node.js なら Buffer.from(s, "base64").toString() です。
デコードしたテキストに � や é のようなおかしな文字が出るのはなぜですか?
� はバイト列が UTF-8 として不正であることを意味し、テキストはおそらく別の文字コードでエンコードされています。文字コードのメニューで Windows-1252、Windows-1251、UTF-16LE、日本語なら Shift_JIS や EUC-JP を試してください。é の代わりに é が出る場合は、エンコードされる前の時点ですでにテキストが文字化けしていました。
= のパディングがない Base64 もデコードできますか?
はい。デコーダーが不足している = を自分で補い、ステータス行でその旨を知らせます。パディングは最後のブロックを埋めるだけなので、長さから必ず復元できます。
デコード結果が意味不明な文字の羅列です。Base64 が壊れているのですか?
多くの場合、データはファイルです。ステータス行の「推定形式」欄を確認してください。画像、PDF、アーカイブなどのバイナリ形式なら、ツールがファイルをプレビューしたり保存したりできるデコーダーへのリンクを表示します。
Base64 は鍵なしでデコードできますか?
いつでもできます。Base64 はアルファベットが公開されたエンコード方式なので、秘匿性はありません。デコード結果がまだランダムに見える場合は、エンコードの前にデータが暗号化または圧縮されています。