本文へ移動
Develop Tools
← 使い方ガイドへ戻る

Base64で日本語・絵文字が文字化けする原因|UTF-8で正しく変換

「こんにちは」をbtoaへ直接渡したErrorや、Decode結果がこのようになる現象は、Base64より前後の文字コード処理が原因です。StringをUTF-8 Byte列へ変換してからEncodeし、Decode後もUTF-8として戻します。

日本語をUTF-8 Byte列へ変換してBase64化し、Decode後に日本語へ戻す流れ
日本語をUTF-8 Byte列へ変換してBase64化し、Decode後に日本語へ戻す流れ

Base64をブラウザ内で変換する

UTF-8文字列やファイルをStandard Base64・Base64URL・Data URLへ変換し、Base64からテキストやファイルへ戻せます。入力内容は変換APIへ送信されません。

Base64 Encoder / Decoderを開く

結論:Encode前とDecode後の文字コードをUTF-8へ揃える

日本語StringをTextEncoderでUTF-8 Byte列へし、そのByte列をBase64化します。Decode時はBase64からByte列へ戻し、TextDecoderのUTF-8でStringへ復元します。

Base64 Text自体はASCIIでも、元Byte列をShift_JISやLatin-1として誤解釈すれば文字化けします。

元データを残したまま、形式、文字コード、Padding、変換結果を順番に確認してください。

文字列とByte列の境界を確認する

JavaScript StringはUnicode文字を保持しますが、btoaは各Code Unitが1Byteに収まるBinary Stringを前提とします。日本語や多くのEmojiはその前提を満たさず、InvalidCharacterErrorになります。

現ツールはTextをUTF-8として扱います。Shift_JISやEUC-JPの既存Base64を直接Textへ戻す文字コード選択機能はないため、Binaryとして保存し対応環境でDecodeします。

確認対象見る内容対応
元String日本語・Emoji・AccentTextEncoder UTF-8
EncodeByte列を入力Base64化
DecodeBase64からByte列TextDecoder UTF-8
既存Data元Encoding不明Binaryとして調査

Base64 Encoder / Decoderで確認する手順

  1. EncodeとStandard Base64を選びます。
  2. こんにちは😀などの文字列を入力します。
  3. 変換後のBase64をCopyし、Decodeへ切り替えます。
  4. 元の日本語・Emojiと完全一致することを確認します。

現ツールはTextEncoder・TextDecoderを使うため、日本語やEmojiをUTF-8で往復できます。

変換できない場合の切り分け

文字化けしたTextを再Encodeして直そうとせず、元Byte列と誤って使った文字コードを特定します。

UTF-8 Byte列をLatin-1としてString化した後に再保存すると、元Byte列まで変わる場合があります。元Base64を保持して異なるEncodingで検証します。

  • btoaへUnicode Stringを直接渡していないか
  • Decode後のByte列をUTF-8として読んだか
  • 元DataがShift_JIS等ではないか
  • 途中でURL DecodeやJSON Escapeが入っていないか

現行のBase64 Encoder / Decoderで扱える範囲

DevelopToolsは入力をブラウザ内で処理します。UTF-8文字列のStandard Base64・PaddingなしBase64URLへのEncode、両形式とBase64形式Data URLのDecode、空白・改行除去、Padding補完、ファイルのBase64・Data URL化、Base64からファイルへの復元、対応画像のPreview、Copy、Download、Byte数と増加率の表示に対応しています。入力内容、変換結果、ファイル名を履歴やLocalStorageへ保存せず、変換APIへ送信しません。

分類現行ツールの動作
文字列TextEncoderでUTF-8 Byte列へ変換し、Standard Base64またはPaddingなしBase64URLへEncode
Decode空白・改行を除去し、URL-safe文字を判別して不足Paddingを補完。不正文字・長さ・Paddingを検査
Data URLbase64指定のPrefixとPayloadを分離し、MIME Typeを復元。Percent Encode型Data URLは対象外
ファイル利用者が選択したFileをByte列としてEncode。Decode後は指定MIME Type・File名で保存
表示UTF-8でないBinaryは無理に文字化せずFile保存を案内。PNG・JPEG・GIF・WebP・SVGはPreview可能

Base64を暗号化・Hash・署名検証と混同しない

Base64は暗号化ではありません。Byte列をASCII文字で表現する可逆的なEncodingで、Decoderがあれば元へ戻せるため、Password、API Token、Cookie、個人情報を秘密にする手段にはなりません。機密性には適切な暗号化と鍵管理、Password保存には専用のPassword Hash、改ざん検出には署名やMACなど用途に合う仕組みが必要です。

JWTのHeader・PayloadをBase64URL Decodeして読めても、Signature、有効期限、Issuer、Audienceが正しいとは判断できません。Basic認証のCredentialもBase64表現に過ぎないため、実通信ではHTTPSを使い、記事・Test・ScreenshotにはUSERNAME、PASSWORD、SAMPLE_TOKENなどのDummy値だけを使用します。

実Credentialや顧客データを変換する必要がある場合も、共有端末・Clipboard履歴・画面共有・保存先を確認してください。

仕様とWeb APIは一次資料で確認する

Alphabet、Padding、Base64URLはRFC 4648、HTTP Basic認証はRFC 7617、JWTのBase64URLはJOSE関連RFCを基準にします。JavaScriptのbtoa・atob、TextEncoder・TextDecoder、Uint8Arrayの対応状況はMDNと利用ブラウザの互換表を確認してください。

具体例:こんにちは😀をUTF-8でRound Tripする

日本語とSupplementary PlaneのEmojiを含むTextで、文字数ではなくUTF-8 Byte数も確認します。

Encode結果をDecodeすると、Code Pointを含めて元のこんにちは😀へ戻ります。

  1. 元Textを別欄へ控える
  2. UTF-8としてBase64 Encodeする
  3. 結果をBase64 Decodeする
  4. 元Textと一文字ずつ比較する

見た目が似たUnicode文字やNormalization差もあるため、必要ならCode Point単位でも比較してください。

よくある質問

Base64は暗号化ですか?
いいえ。Byte列を文字列として表すEncodingで、元データへ戻せます。PasswordやTokenをBase64にしただけでは保護できません。
入力した文字列やファイルはサーバーへ送信されますか?
Base64変換は利用中のブラウザ内で行われます。入力内容・結果・ファイル名を変換API、履歴、LocalStorageへ保存する処理はありません。