Cómo decodificar Base64 a UTF-8
- Pega el Base64 en Entrada · Base64. Juego de caracteres viene ajustado a UTF-8.
- Lee el resultado en Salida · texto. La línea de estado muestra el número de bytes y el tipo de contenido detectado.
- Si la línea de estado dice “Algunos bytes no son UTF-8 válido”, el texto está en otro juego de caracteres. Prueba Detección automática, Windows-1252 o UTF-16LE.
- Copiar salida copia el texto; Descargar guarda los bytes decodificados sin cambios.
Para codificar en la otra dirección, usa UTF-8 a Base64.
Ejemplos
| Base64 | Decodificado como UTF-8 | Qué muestra |
|---|---|---|
8J+YgA== | 😀 | Un emoji, 4 bytes |
4oKs | € | 3 bytes, sin relleno |
bmHDr3ZlIGNhZsOp | naïve café | Letras acentuadas, 2 bytes cada una |
77u/SGk= | Hi | 5 bytes: una marca de orden de bytes y luego Hi |
Y2Fm6Q== | caf� | E9 es é en Latin-1, no válido en UTF-8 |
8J+Y | � | Un emoji cortado tras 3 de sus 4 bytes |
Y2Fmw4PCqQ== | café | UTF-8 válido de un texto que ya venía estropeado |
Las tres últimas filas son los problemas que se tratan a continuación: un juego de caracteres equivocado, una cadena cortada y un texto que ya estaba estropeado antes de codificarse.
UTF-8 no válido y el carácter de sustitución
UTF-8 tiene reglas estrictas: un byte por encima de 7F debe formar parte de una secuencia de 2, 3 o 4 bytes con un patrón fijo. Los bytes que rompen el patrón no se pueden leer como UTF-8. El decodificador sustituye cada secuencia rota por U+FFFD (�) y añade el aviso «Algunos bytes no son UTF-8 válido. Prueba otro juego de caracteres.» No se descarta nada en silencio, así que cada � señala el lugar exacto del problema.
Dos causas explican casi todos los casos:
- Otro juego de caracteres.
Y2Fm6Q==contiene63 61 66 E9, que escaféen ISO-8859-1 y Windows-1252. Cambia Juego de caracteres y aparece el texto. La página del decodificador Base64 recoge los síntomas habituales de cada juego de caracteres. - Una cadena truncada. Si el Base64 se cortó, por ejemplo por el límite de una columna en una base de datos o en una línea de log, el último carácter puede perder parte de sus bytes.
8J+YgA==es un emoji completo;8J+Yes el mismo emoji sin su último byte y se decodifica como un único�. Busca el valor completo en el origen.
Texto doblemente codificado (é y ’)
Cuando la salida muestra é en lugar de é, ü en lugar de ü o ’ en lugar de un apóstrofo tipográfico, el decodificador no tiene la culpa. En algún paso anterior, unos bytes UTF-8 se leyeron como Windows-1252 y se volvieron a guardar como UTF-8, y cada carácter especial se convirtió en dos o tres caracteres erróneos. El Base64 conserva fielmente ese texto dañado: Y2Fmw4PCqQ== es UTF-8 válido de la cadena de siete bytes café.
A menudo puedes reparar una cadena así desde código deshaciendo el error: codifica el texto como Windows-1252 y decodifica los bytes como UTF-8. La solución de verdad está en el sistema que lo escribió.
Marcas de orden de bytes
Algunos editores, sobre todo en Windows, empiezan los archivos UTF-8 con los bytes EF BB BF, una marca de orden de bytes. En Base64, el archivo empieza entonces por 77u/. El decodificador reconoce la marca y la deja fuera del texto, mientras que Descargar conserva los bytes tal cual. Desde código puede que tengas que quitarla tú:
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�'
Sin errors="replace", Python lanza UnicodeDecodeError ante bytes no válidos. En JavaScript, new TextDecoder("utf-8", { fatal: true }) lanza un TypeError en lugar de insertar �, y el decodificador por defecto elimina el BOM igual que esta herramienta. Más en Base64 en Python y Base64 en JavaScript.
Preguntas frecuentes
¿Cómo decodifico Base64 a una cadena UTF-8?
Decodifica el Base64 a bytes y luego interpreta esos bytes como UTF-8. Arriba, todo ocurre en un solo paso. En Python es base64.b64decode(s).decode("utf-8"); en un navegador, new TextDecoder().decode(bytes).
¿Qué significa el carácter � en la salida?
Es U+FFFD, el carácter de sustitución. El decodificador lo inserta allí donde los bytes no forman UTF-8 válido, lo que suele significar que el texto se codificó con otro juego de caracteres o que el Base64 está cortado.
¿Por qué mi texto decodificado empieza con un carácter invisible?
Seguramente el origen tenía una marca de orden de bytes UTF-8 (un Base64 que empieza por 77u/). Esta herramienta la elimina, pero el .decode("utf-8") normal de Python la conserva como \ufeff; usa "utf-8-sig" para quitarla.
¿Es UTF-8 la opción correcta para mi Base64?
Lo más probable es que sí. JSON, la web, Linux y las API modernas usan UTF-8. Los datos de programas antiguos de Windows o las cadenas de .NET y PowerShell pueden venir en Windows-125x o UTF-16.