JavaScriptでのBase64(btoa/atob)

JavaScriptでbtoa()、atob()、およびモダンな代替手段を使ったBase64エンコード・デコードをマスター。Unicode対応、ブラウザとNode.jsの違いも解説します。

Language

詳細な説明

JavaScriptにはBase64用の組み込みグローバル関数が2つあります。エンコード用の btoa() とデコード用の atob() です。これらの名前は初期のNetscape実装に由来し、btoa は「binary to ASCII」、atob は「ASCII to binary」の略です。

基本的な使い方:

// Encoding
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

// Decoding
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"

Unicodeの問題: btoa() はすべての文字のコードポイントが0から255(Latin-1範囲)の文字列のみを受け付けます。btoa("café")btoa("☃") のような文字列を渡すと InvalidCharacterError が発生します。解決策はまずUTF-8にエンコードすることです:

// Encode Unicode to Base64
function utoa(str) {
  return btoa(unescape(encodeURIComponent(str)));
}

// Decode Base64 to Unicode
function atou(b64) {
  return decodeURIComponent(escape(atob(b64)));
}

// Modern approach (2024+)
const encoded = btoa(String.fromCodePoint(
  ...new TextEncoder().encode("Hello ☃")
));

ブラウザ vs Node.js:

  • ブラウザには初期からwindow、worker、service workerコンテキストで btoa()atob() が利用できます。
  • Node.jsはバージョン16でグローバルな btoa()atob() を追加しました。それ以前は Buffer を使う必要がありました:
// Node.js Buffer approach (still common)
Buffer.from("Hello").toString("base64");    // encode
Buffer.from("SGVsbG8=", "base64").toString(); // decode

ブラウザでのファイル処理:

// Using FileReader for files
const reader = new FileReader();
reader.onload = () => console.log(reader.result);
reader.readAsDataURL(file); // returns data:...;base64,...

パフォーマンスに関する注意: 非常に大きな文字列(数メガバイト)の場合、btoa() がメインスレッドをブロックする可能性があります。応答性を向上させるためにWeb Workerの使用やデータのチャンク分割を検討してください。

ユースケース

ユーザーがアップロードした画像を読み取り、Base64に変換し、サーバーとの通信なしにインラインで表示するクライアントサイドのファイル変換ツールを構築する場合に使用します。

試してみる — Base64 Encoder

フルツールを開く