btoa() richiede una stringa binaria con unità rappresentabili in un byte. Non converte automaticamente il testo in UTF-8. Molti caratteri Unicode possono causare InvalidCharacterError: converti prima il testo in byte.
Conversione UTF-8
TextEncoder produce i byte del testo. Il codice seguente li elabora a blocchi prima di btoa, evitando il limite del numero di argomenti. Per decodificare, trasforma il risultato di atob in Uint8Array e usa TextDecoder. L’opzione fatal rileva byte UTF-8 non validi.
Verificare il risultato
안녕하세요 😀 diventa 7JWI64WV7ZWY7IS47JqUIPCfmIA=. La decodifica deve ripristinare esattamente testo e spazi. Il link di esempio usa un nome pubblico predefinito, senza inserire il tuo testo nell’URL. Decodex tratta fino a 5 MB di testo UTF-8 nel browser.
Trovare la causa dell’errore
Un errore di atob riguarda spesso alfabeto, padding o prefissi. Un errore di TextDecoder può indicare dati binari o un’altra codifica. In Node.js puoi usare Buffer.from(text, "utf8").toString("base64"); una decodifica permissiva non sostituisce la validazione.
Prova questo esempio
// Browser JavaScript: text → UTF-8 bytes → Base64.
function utf8ToBase64(text) {
const bytes = new TextEncoder().encode(text);
let binary = '';
for (let i = 0; i < bytes.length; i += 8192) {
binary += String.fromCharCode(...bytes.subarray(i, i + 8192));
}
return btoa(binary);
}
// Accept standard Base64 or Base64URL, with complete or omitted padding.
function base64ToUtf8(value) {
let normalized = value.replace(/\s/g, '').replace(/-/g, '+').replace(/_/g, '/');
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(normalized) ||
normalized.length % 4 === 1 ||
(normalized.includes('=') && normalized.length % 4 !== 0)) {
throw new Error('Invalid Base64 characters, length or padding');
}
normalized += '='.repeat((4 - normalized.length % 4) % 4);
const binary = atob(normalized);
const bytes = Uint8Array.from(binary, character => character.charCodeAt(0));
return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
}
const text = '안녕하세요 😀';
const encoded = utf8ToBase64(text);
console.log(encoded); // 7JWI64WV7ZWY7IS47JqUIPCfmIA=
console.log(base64ToUtf8(encoded)); // 안녕하세요 😀
Domande frequenti
atob restituisce direttamente il testo Unicode?
No. Restituisce una stringa binaria. Converti i valori in Uint8Array e leggili con TextDecoder("utf-8"). Evita le vecchie soluzioni basate su unescape().
