Base64のエンコード・デコード方法
- テキストをBase64にするならエンコードを、Base64をテキストに戻すならデコードを選びます。
- 上のボックスに入力するか貼り付けると、すぐに結果が表示されます。結果をURL、ファイル名、トークンに使う場合はURLセーフなBase64にチェックを入れます。
- コピーをクリックするか、⇅ 入れ替えで結果を入力欄に移して方向を逆にします。値が正しく元に戻るかを確かめるのに便利です。
テキストはエンコードの前にUTF-8のバイト列に変換されるので、日本語、中国語、韓国語、アラビア語、アクセント付きの文字、絵文字もすべて問題なく扱えます。デコーダーは寛容に動きます。改行やスペースを無視し、=のパディングがあってもなくても受け付け、標準とURLセーフの両方の文字セットを認識し、先頭のdata:…;base64,も取り除きます。デコードしたバイト列が正しいUTF-8テキストでない場合は、バイト数とファイルの種類(PNG、JPEG、GIF、WebP、PDF、ZIP)を知らせ、画像ならプレビューを表示し、デコードしたファイルをダウンロードボタンを出します。
ファイルをBase64に変換
下のパネルでファイルを選ぶと、すぐにBase64が表示され、ファイル名、サイズ、Base64の長さも示されます。データURLの接頭辞を付けるにチェックが入っていると、結果がdata:image/png;base64,のように始まるので、HTMLのsrc属性やCSSのurl()にそのまま貼り付けられます。チェックを外すとBase64だけが出力されます。接頭辞のファイル形式はブラウザーが判定したもので、ブラウザーがわからない形式ならapplication/octet-streamになります。ファイルはブラウザーが直接読み込み、アップロードはされません。
Base64の仕組み
Base64は入力を3バイト(24ビット)ずつに区切り、6ビットずつの4つのグループに分けます。0〜63の各6ビットの値を、A–Z(0–25)、a–z(26–51)、0–9(52–61)、+(62)、/(63)のいずれか1文字で表します。代表的な例が英単語のManです。3バイトの01001101 01100001 01101110を区切り直すと010011 010110 000101 101110、つまり19、22、5、46となり、文字ではTWFuです。
入力の長さが3の倍数でないときは、最後のグループにパディングを付けます。MaはTWE=、MはTQ==になります。3バイトが4文字になるので、Base64は元のデータより約3分の1大きくなります。100バイトは136文字、1,000バイトは1,336文字です。文字セット、パディング、URLセーフ版はすべてRFC 4648で定義されています。電子メール(MIME)ではさらにBase64を1行76文字以下に折り返しますが、このツールは途切れのない1行で出力し、折り返された入力も問題なくデコードします。
例
| テキスト | UTF-8のバイト数 | Base64 | URLセーフ |
|---|---|---|---|
| Hello | 5 | SGVsbG8= | SGVsbG8 |
| こんにちは | 15 | 44GT44KT44Gr44Gh44Gv | 44GT44KT44Gr44Gh44Gv |
| 你好 | 6 | 5L2g5aW9 | 5L2g5aW9 |
| café | 5 | Y2Fmw6k= | Y2Fmw6k |
| 😀 | 4 | 8J+YgA== | 8J-YgA |
| <<???>> | 7 | PDw/Pz8+Pg== | PDw_Pz8-Pg |
ひらがなはUTF-8で1文字3バイトなので、「こんにちは」の5文字は15バイト、Base64では20文字になります。15バイトは3の倍数なので、パディングは付きません。
URLセーフなBase64(base64url)
URLの中では+がスペースと解釈されることがあり、/はパスの区切り、=はクエリ文字列で特別な意味を持ちます。URLセーフ版は+を-に、/を_に置き換え、表の最後の行のように、ふつうはパディングも省きます。JSON Web Token(JWT)は3つの部分すべてにこの方式を使っています。デコードするときにどちらの方式かを指定する必要はなく、両方とも自動で認識されます。
Base64が使われている場所
- データURLは、小さな画像やフォントをHTMLやCSSに直接埋め込むときに使います。
- メールの添付ファイルは、メッセージの中にBase64で入って送られます。
- HTTPのBasic認証は
ユーザー名:パスワードをBase64で送ります。規格書の例であるAladdin:open sesameはQWxhZGRpbjpvcGVuIHNlc2FtZQ==になり、Basic認証がHTTPS上でしか安全でない理由もここからわかります。 - APIやJSONでは、画像、署名、鍵などのバイナリデータをテキストのフィールドに入れるためにBase64を使います。
覚えておくと便利な先頭部分もあります。iVBORw0KGgoで始まればPNGファイル、/9j/はJPEG、JVBERi0はPDF、eyJはたいていJWTのヘッダーのようなJSONオブジェクトです。
うまくデコードできないとき
- 「Base64では使われない文字が含まれています」 – 値と一緒に引用符や記号までコピーしてしまったことがよくあります。URLから取った文字列に
%3Dや%2Fが含まれているなら、先にURLエンコード・デコードでデコードしてください。 - 「入力の長さが正しくありません」 – コピーの途中で末尾が切れるなどして、文字列の一部が欠けています。
- テキストではなくバイナリデータと表示されるとき – 本当にファイルであるか、UTF-8ではない古い文字コードで保存されたテキストです。たとえばShift_JISで保存された「あい」のBase64である
gqCCog==は正しいUTF-8ではないため、4バイトのバイナリとして表示されます。WordやExcelのファイル(.docx、.xlsx)はZIP形式なのでdecoded.zipとして保存されます。元の拡張子に名前を変えてください。
よくある質問
Base64は暗号化ですか?
いいえ。鍵のない、元に戻せるエンコードなので、誰でもすぐにデコードできます。パスワードや個人情報を隠す目的で使ってはいけません。
結果の末尾に=や==が付くのはなぜですか?
パディングです。入力を3バイトずつ区切って2バイト余れば=が1つ、1バイト余れば2つ付きます。最後のグループに何バイト入っているかをデコーダーに伝える役割があります。
ここでJWTをデコードできますか?
ドットで区切られた3つの部分を1つずつデコードすることはできますが、JWTデコーダーなら、トークンを自動で分割し、ヘッダーとペイロードを整形したJSONで、日時は読みやすい形で表示します。
どれくらい大きなファイルまで変換できますか?
上限はブラウザーのメモリです。ただし、データURLは小さなファイル向けです。大きな画像をBase64で埋め込むとページが3分の1ほど重くなり、画像をページとは別にキャッシュすることもできなくなります。