Base64 encodes bytes, and text is not bytes until you say so
This is the source of nearly every mangled result. Before a string can be Base64 encoded it must first become a sequence of bytes, and that requires a character encoding. Choose UTF-8 and a pound sign is two bytes; choose Latin-1 and it is one; choose wrongly on the way back and you get a question mark, a black diamond, or the famous pair of characters that appear wherever UTF-8 has been read as something else.
This tool encodes and decodes through UTF-8 in both directions, which is the encoding the web has standardised on and the one your API, your database and your JSON payload almost certainly use. Round-tripping an emoji, a Cyrillic name or a Japanese address gets you back exactly what you put in.
Data URIs are the other half of what people paste
A great deal of the Base64 that arrives in front of a developer is not a bare string - it is a data URI, with a media type and a comma in front of the payload. Feed the whole thing to a naive decoder and it fails, because data:image/png;base64, is not valid Base64. Strip the prefix by hand and you lose the one piece of information that told you what the bytes were.
Recognising the prefix rather than choking on it means you can paste what you actually have: the attribute value out of an HTML email, the inline image from a CSS file, the avatar embedded in an API response.
Base64 is not, and has never been, encryption
It is worth stating plainly because the mistake is common and expensive. Base64 is a reversible encoding with no key, designed to move binary data through channels that only accept text. Anyone can decode it. A password, a token or an API key stored Base64-encoded is stored in plain sight with a thin coat of paint over it.
The legitimate uses are the ones it was built for: an attachment inside an email, a small image inline in a stylesheet, a binary field inside a JSON document, a credential in an Authorization header where the transport rather than the encoding provides the secrecy.