Base64 エンコード/デコード — btoa(str) / atob(b64)
JavaScript には文字列を Base64 形式に変換するための関数が標準で用意されています。
Base64 は「バイナリデータや特殊文字を安全に文字列として扱う」ためのエンコード方式です。画像やテキストをデータURLにしたり、簡易的にデータを保存・送信するときに使われます。
基本のコード例
// エンコード(文字列 → Base64)
const str = "Hello World!";
const encoded = btoa(str);
console.log(encoded); // "SGVsbG8gV29ybGQh"
// デコード(Base64 → 文字列)
const decoded = atob(encoded);
console.log(decoded); // "Hello World!"
JavaScriptbtoa(str): 文字列を Base64 に変換。atob(b64): Base64 を元の文字列に戻す。
注意点(UTF-8文字列の場合)
btoa / atob は ASCII(英数字や記号)専用。日本語や絵文字などの UTF-8文字列 を直接渡すとエラーや文字化けになります。
→ 対策: encodeURIComponent / decodeURIComponent を組み合わせて UTF-8 を安全に処理します。
UTF-8対応のラッパー関数
function toBase64(str) {
return btoa(unescape(encodeURIComponent(str)));
}
function fromBase64(b64) {
return decodeURIComponent(escape(atob(b64)));
}
const original = "こんにちは世界🌏";
const encoded = toBase64(original);
const decoded = fromBase64(encoded);
console.log(encoded); // "44GT44KT44Gr44Gh44Gv5LiW55WM8J+Mjw=="
console.log(decoded); // "こんにちは世界🌏"
JavaScriptよく使うテンプレート集
画像をBase64に変換(DataURL)
const img = document.getElementById("myImg");
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
const dataURL = canvas.toDataURL("image/png");
console.log(dataURL); // "data:image/png;base64,...."
JavaScriptJSONデータをBase64に変換
const obj = { user: "Aki", age: 20 };
const json = JSON.stringify(obj);
const b64 = btoa(json);
console.log(b64);
const back = JSON.parse(atob(b64));
console.log(back); // { user: "Aki", age: 20 }
JavaScriptHTTPヘッダに安全に埋め込む
const token = "user:password";
const auth = "Basic " + btoa(token);
console.log(auth); // "Basic dXNlcjpwYXNzd29yZA=="
JavaScript例題: 簡易的な「暗号化」風メモ帳
<textarea id="memo">秘密のメモ</textarea>
<button id="save">保存</button>
<button id="load">復元</button>
<div id="out"></div>
<script>
let storage = "";
document.getElementById("save").addEventListener("click", () => {
const txt = document.getElementById("memo").value;
storage = btoa(unescape(encodeURIComponent(txt))); // UTF-8対応
alert("Base64で保存しました!");
});
document.getElementById("load").addEventListener("click", () => {
const decoded = decodeURIComponent(escape(atob(storage)));
document.getElementById("out").textContent = decoded;
});
</script>
HTML- 効果: 入力したメモを Base64 で保存し、復元ボタンで元に戻せる。
実務でのコツ
- ASCII専用: 日本語や絵文字は直接渡さず、UTF-8対応ラッパーを使う。
- 用途: データURL、HTTP認証、簡易的なデータ保存など。
- セキュリティ: Base64は暗号化ではなく「文字列変換」。安全性はないので秘密情報の保護には不向き。
- 長さ: Base64は元データより約33%長くなる。大きなファイルには不向き。
ありがちなハマりポイントと対策
- 日本語が文字化け:
- 対策:
encodeURIComponentと組み合わせる。
- 対策:
- 暗号化と誤解:
- 対策: Base64は「変換」であり「暗号化」ではない。
- サイズが大きくなる:
- 対策: 大容量データには使わず、ファイル転送は別の方法を。
練習問題(コピー&ペースト変換ツール)
<input id="txt" placeholder="文字を入力">
<button id="enc">エンコード</button>
<button id="dec">デコード</button>
<div id="out"></div>
<script>
const out = document.getElementById("out");
document.getElementById("enc").addEventListener("click", () => {
const str = document.getElementById("txt").value;
out.textContent = btoa(unescape(encodeURIComponent(str)));
});
document.getElementById("dec").addEventListener("click", () => {
const str = document.getElementById("txt").value;
out.textContent = decodeURIComponent(escape(atob(str)));
});
</script>
HTML- 効果: 入力した文字を Base64 に変換したり、逆に戻したりできる。
直感的な指針
btoa= 文字列を Base64 に変換。atob= Base64 を元に戻す。- 日本語などは
encodeURIComponent/decodeURIComponentを組み合わせる。 - Base64は「安全な文字列化」であって「暗号化」ではない。
これを覚えれば「日本語を含む文字列を安全にURLやHTTPヘッダに埋め込む」「画像やJSONを文字列化する」といった場面で安心して使えます。
