Base64 を UTF-8 にデコードする手順
- Base64 を 入力 · Base64 に貼り付けます。文字コード はあらかじめ UTF-8 に設定されています。
- 結果を 出力 · テキスト で確認します。ステータス行にはバイト数と検出されたコンテンツの種類が表示されます。
- ステータス行に「一部のバイトが UTF-8 として不正です」と表示された場合、テキストは別の文字コードです。自動検出、Windows-1252、UTF-16LE を試してください。
- 出力をコピー でテキストをコピーし、ダウンロード でデコードしたバイト列をそのまま保存します。
逆方向にエンコードするには UTF-8 から Base64 へ を使います。
例
| Base64 | UTF-8 としてのデコード結果 | わかること |
|---|---|---|
8J+YgA== | 😀 | 絵文字 1 つ、4 バイト |
4oKs | € | 3 バイト、パディング不要 |
bmHDr3ZlIGNhZsOp | naïve café | アクセント付きの文字はそれぞれ 2 バイト |
77u/SGk= | Hi | 5 バイト:バイト順マークの後に Hi |
Y2Fm6Q== | caf� | E9 は Latin-1 の é で、UTF-8 としては不正 |
8J+Y | � | 4 バイトの絵文字が 3 バイト目で途切れている |
Y2Fmw4PCqQ== | café | すでに文字化けしたテキストの、UTF-8 としては正しいデータ |
最後の 3 行は、以下で取り上げる問題の例です。文字コードの間違い、途中で切れた文字列、エンコード前にすでに文字化けしていたテキストです。
不正な UTF-8 と置換文字
UTF-8 には厳格なルールがあります。7F より大きいバイトは、決まったパターンを持つ 2、3、4 バイトのシーケンスの一部でなければなりません。パターンに合わないバイトは UTF-8 として読めません。デコーダーは壊れたシーケンスをそれぞれ U+FFFD(�)に置き換え、「一部のバイトが UTF-8 として不正です。別の文字コードをお試しください(文字化けの可能性があります)。」という注意を表示します。黙って捨てられるものはないので、� の一つひとつが問題の正確な位置を示しています。
原因はほぼ次の 2 つに絞られます。
- 別の文字コード。
Y2Fm6Q==の中身は63 61 66 E9で、ISO-8859-1 や Windows-1252 ではcaféです。文字コード を切り替えればテキストが現れます。文字コードごとのよくある症状は Base64 デコーダー のページにまとめています。 - 文字列の途切れ。 データベースの列の長さ制限やログの 1 行の上限などで Base64 が切られると、最後の文字のバイトの一部が失われることがあります。
8J+YgA==は完全な絵文字ですが、8J+Yは同じ絵文字の最後の 1 バイトが欠けたもので、�1 文字にデコードされます。元のデータで値全体を探してください。
二重エンコードされたテキスト(é や ’)
出力で é が é、ü が ü、カーリーアポストロフィが ’ になっている場合、デコーダーのせいではありません。それより前のどこかで UTF-8 のバイト列が Windows-1252 として読まれ、UTF-8 として保存し直されたため、特殊文字が 1 文字につき 2〜3 文字の誤った文字に変わっています。Base64 は、その壊れたテキストを忠実に保持しているだけです。Y2Fmw4PCqQ== は 7 バイトの文字列 café を表す正しい UTF-8 です。
こうした文字列は、コードで誤りを逆にたどれば直せることがよくあります。テキストを Windows-1252 でエンコードし、そのバイト列を UTF-8 としてデコードします。ただし根本的な修正は、それを書き込んだシステムの側で行う必要があります。
バイト順マーク(BOM)
一部のエディター、特に Windows のものは、UTF-8 ファイルの先頭にバイト順マークである EF BB BF を付けます。Base64 にすると、ファイルは 77u/ で始まります。デコーダーはこのマークを認識してテキストからは除外しますが、ダウンロード ではバイト列を元のまま保存します。コードでは自分で取り除く必要がある場合があります。
import base64
raw = base64.b64decode("77u/SGk=")
raw.decode("utf-8") # '\ufeffHi'
raw.decode("utf-8-sig") # 'Hi'
base64.b64decode("Y2Fm6Q==").decode("utf-8", errors="replace") # 'caf�'
errors="replace" を付けないと、Python は不正なバイトで UnicodeDecodeError を送出します。JavaScript の new TextDecoder("utf-8", { fatal: true }) は � を挿入する代わりに TypeError を投げ、既定のデコーダーはこのツールと同じく BOM を取り除きます。詳しくは Python での Base64 と JavaScript での Base64 をご覧ください。
よくある質問
Base64 を UTF-8 の文字列にデコードするには?
Base64 をバイト列にデコードし、そのバイト列を UTF-8 として解釈します。上のツールではこれを 1 ステップで行います。Python なら base64.b64decode(s).decode("utf-8")、ブラウザなら new TextDecoder().decode(bytes) です。
出力に表示される � は何を意味しますか?
U+FFFD、つまり置換文字です。バイト列が UTF-8 として成り立たない箇所にデコーダーが挿入します。たいていは、テキストが別の文字コードでエンコードされていたか、Base64 が途中で切れていたことを意味します。
デコードしたテキストの先頭に見えない文字が入るのはなぜですか?
元データに UTF-8 のバイト順マーク(77u/ で始まる Base64)が付いていたと考えられます。このツールは取り除きますが、Python の素の .decode("utf-8") は \ufeff として残します。取り除くには "utf-8-sig" を使ってください。
この Base64 には UTF-8 を選べばよいですか?
ほとんどの場合はそうです。JSON、Web、Linux、最近の API はどれも UTF-8 を使います。古い Windows プログラムのデータや、.NET や PowerShell の文字列は Windows-125x や UTF-16 のことがあります。