btoa() verwacht een binaire tekenreeks met eenheden die in één byte passen. Het zet tekst niet automatisch om naar UTF-8. Veel Unicode-tekens veroorzaken InvalidCharacterError; maak eerst UTF-8-bytes.
UTF-8 coderen en decoderen
TextEncoder maakt bytes van tekst. De code hieronder verwerkt blokken vóór btoa om de limiet op functieargumenten te vermijden. Zet bij decoderen de uitvoer van atob om in Uint8Array en gebruik TextDecoder. De optie fatal meldt ongeldige UTF-8-bytes.
Controleer een volledige rondgang
안녕하세요 😀 wordt 7JWI64WV7ZWY7IS47JqUIPCfmIA=. Decoderen moet dezelfde tekst en spaties teruggeven. De voorbeeldlink gebruikt een vaste openbare voorbeeldnaam, zonder jouw tekst in de URL. Decodex verwerkt maximaal 5 MB UTF-8-tekst in de browser.
Bepaal waar het fout gaat
Een atob-fout wijst vaak op alfabet, padding of een voorvoegsel. Een TextDecoder-fout kan duiden op binaire gegevens of een andere tekencodering. Gebruik in Node.js Buffer.from(text, "utf8").toString("base64"); tolerant decoderen vervangt geen invoervalidatie.
Probeer dit voorbeeld
// 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)); // 안녕하세요 😀
Veelgestelde vragen
Geeft atob meteen leesbare Unicode terug?
Nee. Het resultaat is een binaire tekenreeks. Zet de waarden om in Uint8Array en lees ze met TextDecoder("utf-8"). Vermijd oude oplossingen met unescape().
