btoa() erwartet eine Binärzeichenfolge mit Codeeinheiten im Ein-Byte-Bereich. Es wandelt Text nicht automatisch in UTF-8 um. Koreanisch, Hindi und viele Emojis können InvalidCharacterError auslösen. Verwende explizite UTF-8-Bytes für verlässliche Ergebnisse.
Unicode kodieren und dekodieren
TextEncoder wandelt Text in Bytes um. Der folgende Code verarbeitet kleine Blöcke vor btoa und vermeidet damit zu viele Funktionsargumente bei großen Texten. Zum Wiederherstellen liefert atob Bytes, die TextDecoder als UTF-8 liest. Die Option fatal erkennt ungültige Bytes.
Den vollständigen Hin- und Rückweg prüfen
안녕하세요 😀 ergibt 7JWI64WV7ZWY7IS47JqUIPCfmIA=. Die Dekodierung muss Text, Leerzeichen und Emoji unverändert wiederherstellen. Der Beispiellink öffnet den Konverter mit festgelegten öffentlichen Daten, ohne Benutzereingaben in die URL aufzunehmen. Decodex verarbeitet lokal bis zu 5 MB UTF-8-Text.
Den fehlerhaften Schritt erkennen
Ein atob-Fehler deutet häufig auf ungültiges Base64, Padding oder Präfixe hin. Ein TextDecoder-Fehler kann Binärdaten oder eine andere Zeichenkodierung bedeuten, selbst bei gültigem Base64-Alphabet. In Node.js kodiert Buffer.from(text, "utf8").toString("base64") Text; die großzügige Dekodierung ersetzt keine Eingabevalidierung.
Beispiel ausprobieren
// 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)); // 안녕하세요 😀
Häufige Fragen
Liefert atob direkt lesbaren Text?
Nein. Es liefert eine Binärzeichenfolge. Übertrage die Werte in Uint8Array und verwende TextDecoder("utf-8"). Bevorzuge diesen Ansatz gegenüber älteren Funktionen wie unescape().
Quellen
Weitere Base64-Anleitungen
Base64 und Base64URL: Unterschiede, Padding und Beispiele
Vergleiche Base64 und Base64URL, + / und - _, Padding und UTF-8-Dekodierung anhand geprüfter Beispiele.
Base64-Padding: Was = und == bedeuten
Base64-Padding mit f, fo und foo verstehen. Fehlende Füllzeichen, ungültige Längen und teilweise gefüllte Zeichenfolgen prüfen.
