Base64 をテキストに変換する方法
- 入力 · Base64 欄に Base64 文字列を貼り付けます。スペース、改行、前後の引用符があっても問題ありません。
- 出力 · テキスト でテキストを読みます。ツールの下のステータス行には、入力が有効な Base64 か、何バイトを含んでいたか、内容が何に見えるかが表示されます。
- 出力に
�やおかしな文字が出たら、文字コード を変更します(日本語用の Shift_JIS や EUC-JP もあります)。自動検出 は、バイトオーダーマーク、UTF-8、UTF-16 を確認します。 - 出力をコピー でテキストをコピーするか、ダウンロード で保存します。
逆方向は テキストを Base64 に変換 です。
文字列が Base64 かどうかを見分ける
Base64 文字列が使うのは、64 種類の文字とパディング用の = だけです。標準の Base64 には + と / があり、URLセーフのバリアントでは代わりに - と _ を使います。パディング付きの文字列は長さが 4 で割り切れ、= は末尾にしか置けません。
これらの規則は必要条件ですが、十分条件ではありません。普通の単語の多くもこれを満たします。Test は有効な Base64 で、デコードすると意味のない 3 バイト 4D EB 2D になります。実用的な確認方法は、文字列をデコードして意味のあるものが出てくるか見ることです。「はい/いいえ」以上のことを知りたい場合は、Base64 バリデーター を使ってください。文字、長さ、パディングのどの規則に違反しているかを示し、そもそも Base64 である可能性がどの程度かを点数で表します。
例
| Base64 文字列 | テキスト | 備考 |
|---|---|---|
VGhhbmsgeW91IQ== | Thank you! | プレーンな ASCII |
SGVsbG8sIFfDtnJsZA== | Hello, Wörld | ö は UTF-8 で 2 バイト |
5L2g5aW9 | 你好 | 6 バイト、1 文字あたり 3 バイト |
0J/RgNC40LLQtdGC | Привет | UTF-8 のキリル文字 |
QmFzZTY0IGlzIG5vdCBlbmNyeXB0aW9uLg== | Base64 is not encryption. | 誰でも読めます |
dXNlcm5hbWU6c2VjcmV0 | username:secret | HTTP の Basic 認証ヘッダーの形式 |
最後の行のとおり、Authorization: Basic ヘッダーを見た人なら誰でも、その中のパスワードを読めます。Basic 認証デコーダー はこうしたヘッダーをユーザー名とパスワードに分けます。実際に秘密を守っているのが HTTPS である理由は、エンコードと暗号化の違い で説明しています。
バイト列から文字列へ
Base64 をデコードすると、得られるのはバイト列です。そこから文字列を取り出すのは文字コードを必要とする第 2 の段階で、「テキストがおかしい」問題のほとんどはこの段階で起きます。多くの言語では、2 つの段階が明示的に分かれています。
import base64
raw = base64.b64decode("SGVsbG8sIFfDtnJsZA==")
raw # b'Hello, W\xc3\xb6rld'
raw.decode("utf-8") # 'Hello, Wörld'
raw.decode("latin-1") # 'Hello, Wörld'
JavaScript では、fatal: true を付けた TextDecoder が、黙って � を入れる代わりに TypeError を投げます。壊れたテキストを保存するより失敗させたい場合に便利です。
const bytes = Uint8Array.from(atob("Y2Fm6Q=="), c => c.charCodeAt(0));
new TextDecoder("utf-8", { fatal: true }).decode(bytes);
// TypeError: the bytes are not valid UTF-8
new TextDecoder("windows-1252").decode(bytes); // "café"
その他のパターンは Python と JavaScript のページにあります。
出力が読めるテキストにならない場合
- ほとんどが記号で、読める単語が少しだけある。 文字列にはファイルが入っています。ステータス行の 推定形式 を確認してから、プレビューと保存ができる Base64 をファイルに変換 で開いてください。
- 文字の間に隙間が空いている。 テキストは UTF-16 です。文字コード を UTF-16LE にしてください。
- テキストは読めるが、
éがéと表示される。 エンコードされる前のどこかの段階で、テキストが誤ってデコードされています。Base64 には問題がなく、元のデータの側に問題があります。 - 出力がまた Base64 になっている。 二重にエンコードされています。出力をコピーして入力に貼り付け、もう一度デコードしてください。
- ランダムに見えるバイト列で、形式も判別されない。 データはおそらく暗号化か圧縮されています。Base64 のデコードは最初の層にすぎません。gzip や zlib のデータなら gzip Base64 デコーダー を試してください。
よくある質問
Base64 文字列とは何ですか?
A~Z、a~z、0~9、+、/ だけでできた文字列で、= や == で終わることがよくあります。バイト列を表していて、その中身はテキストのことも、画像などのファイルのこともあります。プレーンな文字しか扱えないシステムでも壊れないように書かれたものです。
デコードする前に Base64 文字列の中身を知るには?
先頭の文字で分かることがよくあります。eyJ は JSON、PD94bWwg は XML、iVBORw0KGgo は PNG、JVBERi0 は PDF です。デコード後は、ステータス行に判別した形式が表示されます。よく見る Base64 の接頭辞 を参照してください。
Python で Base64 を文字列に変換するには?
base64.b64decode(s).decode("utf-8") です。最初の呼び出しはバイト列を返し、.decode() が指定した文字コードでそれを str に変換します。
デコードしたテキストがまた Base64 文字列になっているのはなぜですか?
値が二重にエンコードされています。システムの 2 つの層がそれぞれエンコードすると起こります。出力を入力欄に貼り付けて、もう一度デコードしてください。