ASCII テキストを Base64 にエンコードする方法
- 入力 · テキストにテキストを入力するか貼り付けます。文字コードはあらかじめ ASCII に設定されています。
- Base64 が出力 · Base64 に表示されます。ASCII 以外の文字が含まれていると、ツールの下の警告に
?に置き換えた数が表示されます。 - それらの文字を削除するか置き換えるか、受け手が理解できるなら文字コードを UTF-8 に切り替えます。
- 結果をコピーするか、
base64.txtとしてダウンロードします。
逆方向の変換は Base64 を ASCII にです。
ASCII に含まれる文字
ASCII は 0〜127 の 128 個のコードを定義しており、それぞれ最上位ビットが 0 の 1 バイトです。コード 32〜126 が印字可能な文字で、空白、数字、英字、一般的な記号が含まれます。コード 0〜31 と 127 は制御文字で、タブ(9)、ラインフィード(10)、キャリッジリターン(13)などがあります。
それ以外のもの、たとえば é、ß、€、カーリークォート、ノーブレークスペース、絵文字、そして日本語の文字はすべて ASCII ではありません。ワープロやウェブページから貼り付けたテキストには、こうした文字が気づかないうちに紛れ込んでいることがよくあります。典型的なのは印刷用の引用符やダッシュで、置き換えの警告がそれを知らせます。
例
| テキスト | Base64 | 備考 |
|---|---|---|
Hello, ASCII! | SGVsbG8sIEFTQ0lJIQ== | UTF-8 と同じ |
200 OK | MjAwIE9L | 6 バイト、パディングなし |
{}[]<> | e31bXTw+ | 記号も普通のバイト |
a、タブ、b | YQli | タブはバイト 09 |
line1 CR LF line2 | bGluZTENCmxpbmUy | 途中に 0D 0A |
user:pass | dXNlcjpwYXNz | HTTP Basic 認証の資格情報 |
Grüße | R3I/P2U= | 2 文字が ? に置き換え |
naïve café | bmE/dmUgY2FmPw== | 2 文字が ? に置き換え |
すべての文字を 1 バイトでエンコードするので、サイズの予測も簡単です。n 文字なら Base64 は 4 × ⌈n / 3⌉ 文字になります。
ASCII と Base64 が一緒に語られる理由
Base64 は、7 ビットの ASCII しか安全に運べない経路のために設計されました。古典的な例が初期のメール(SMTP)です。127 を超えるバイトは途中で削られたり変えられたりすることがあったため、バイナリの添付ファイルや英語以外のテキストは、どのシステムでも扱える ASCII のサブセットにエンコードされました。これは今も Base64 が存在する理由であり、そのアルファベットの説明にもなっています。印字可能で、ASCII から派生したどの文字セットでも同じで、+ と / を除けば一般的な形式で特別な意味を持たない 64 文字です。仕組みは Base64 の仕組みで順を追って説明しています。
今でも ASCII だけを前提とするシステムがあります。たとえばレガシーなインターフェースや、ASCII 以外の扱いがサーバーによって異なる HTTP ヘッダーの値です。ここで ASCII の文字コードを使ってエンコードすれば、送る前に入力がそうしたシステムで安全かどうかを確認できます。Authorization ヘッダーに限れば、Basic 認証ヘッダー生成ツールが Basic dXNlcjpwYXNz という値全体を組み立てます。
コードで ASCII を Base64 に変換する
Python はデフォルトで ASCII 以外の文字を拒否するので、これがそのままチェックになります。
import base64
base64.b64encode("200 OK".encode("ascii")).decode() # 'MjAwIE9L'
"Grüße".encode("ascii")
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3
"Grüße".encode("ascii", errors="replace") # b'Gr??e', like this tool
JavaScript の btoa() はコード 255 までのすべての文字を受け付けるので、ü のような Latin-1 の文字は捕まえられません。純粋な ASCII でなければならない場合は、先に /^[\x00-\x7F]*$/.test(s) で文字列を確認してください。詳しくは Python と JavaScript のページをご覧ください。
よくある質問
ASCII から Base64 への変換は UTF-8 から Base64 への変換と違いますか?
純粋な ASCII テキストなら違いはありません。UTF-8 は最初の 128 文字が ASCII と同じバイト値を保つように設計されているので、Hello, ASCII! はどちらでも SGVsbG8sIEFTQ0lJIQ== になります。違いが出るのは、テキストにそれ以外の文字が含まれるときだけです。
ü や絵文字のような文字はどうなりますか?
ASCII にはそれらのコードがないので、それぞれ ?(バイト 3F)になり、ツールが置き換えた数を表示します。Grüße は R3I/P2U= にエンコードされ、デコードすると Gr??e になります。日本語の文字も同じく ? になります。
Base64 の出力自体は ASCII ですか?
はい。Base64 が使う 65 文字(A–Z、a–z、0–9、+、/、=)はすべて印字可能な ASCII です。Base64 が 7 ビットのテキストしか扱えないシステムを通り抜けられるのはこのためです。
タブや改行のような制御文字もエンコードできますか?
できます。これらも ASCII(コード 0–31)で、他のバイトと同じようにエンコードされます。a、タブ、b は YQli になります。