Bytes und Zeichen sind getrennte Schritte

RFC 4648 Base64 stellt Bytes durch Zeichen dar. Es bestimmt weder Text oder Bild noch die Textcodierung. Diese minimalen Tests trennen die Schritte; es sind keine Bilddateien.

w6k= ergibt C3 A9: é in UTF-8. /w== ergibt FF und scheitert bei UTF-8. ww== ergibt nur C3 ohne nötiges Folgebyte. Alle drei wurden zu Bytes decodiert. @@@ wurde bereits dort abgewiesen.

Drei Base64-Eingaben, Hex-Bytes und UTF-8-Ergebnisse
Eigenes Diagramm reproduzierter Tests. Links Base64, mittig Bytes, rechts UTF-8. Nur é ist Textausgabe; TypeError ist der Ausnahmename im Testcode.

RFC 4648: Base64

Ersetzen und strikte Decodierung unterscheiden sich

WHATWG definiert replacement als TextDecoder-Standardmodus; fatal: true wirft bei Decodierfehlern eine Ausnahme. Unser Standardtest mit FF ergab U+FFFD. Moyoutil verwendet fatal: true und meldet einen Fehler. Ein Ersatzzeichen stellt den genauen Originaltext nicht wieder her.

const bytes = Uint8Array.from(atob('/w=='), c => c.charCodeAt(0));
// bytes: [255] = FF
new TextDecoder('utf-8').decode(bytes); // U+FFFD
new TextDecoder('utf-8', {fatal: true}).decode(bytes); // TypeError

Prüfe zunächst, ob die Quelle UTF-8-Text ist. Bilder und komprimierte Dateien gehören nicht in dieses Textwerkzeug. Bei anderer Codierung prüfe das Quellsystem und nutze ein passendes Werkzeug. Base64 bestimmt die Codierung nicht. Moyoutil rät sie nicht und unterstützt kein Base64URL mit - und _.

WHATWG: TextDecoder

Häufig gestellte Fragen

Behebt geändertes = einen UTF-8-Fehler?

Sind die Bytes bereits decodiert, hilft beliebiges Ändern von = nicht. Prüfe Quellcodierung oder abgeschnittene Daten. /w== ergibt FF, aber keinen gültigen UTF-8-Text.