Short answer: choose a direction, paste your value, and the result appears as you type. Encode works on UTF-8 bytes, so non-English text survives. Decode accepts the standard and URL-safe alphabets, with or without padding, and tells you when the bytes are binary instead of text.
What Base64 actually does
Base64 maps every three bytes to four printable characters from a 64-character alphabet, so any binary payload can travel through a channel that only carries text. It grows data by about a third. It hides nothing: there is no key and no secret, which is why a Base64 string in a URL is not a protected value.
UTF-8 first, always
Many encoders use btoa() directly on a JavaScript string, which throws on any character above U+00FF — so "₹", "नमस्ते" and emoji break. This page encodes the UTF-8 bytes of the string, which is what every modern API expects and whatBuffer.from(text).toString('base64') produces in Node.
Decoding safely
- Whitespace and line breaks are ignored, so PEM and email bodies decode directly.
- Missing padding is restored; a length that cannot come from whole bytes is an error.
- A character outside the alphabet is named in the error message rather than skipped, so a truncated copy does not silently decode to a shorter payload.
- If the decoded bytes are not UTF-8, the result is shown as hex. That is the honest answer: a PNG or a compressed payload is not text.
Need to inspect a token instead? The JWT decoder reads the three Base64URL segments and their claims.