So dekodieren Sie Quoted-Printable
- Klicken Sie über dem Tool auf Quoted-printable → Text, um auf Dekodieren umzuschalten.
- Fügen Sie den kodierten Text in die Eingabe ein, zum Beispiel einen Body-Teil aus dem Quelltext einer E-Mail.
- Lesen Sie den Text in der Ausgabe. Sehen Umlaute oder Akzente falsch aus, stellen Sie unter der Ausgabe Zeichensatz auf den Zeichensatz, den der Header
Content-Typedes Teils nennt, etwacharset=iso-8859-1. - Ausgabe kopieren oder Herunterladen. Weiche Zeilenumbrüche werden zusammengefügt, und jedes
=XXwird wieder zu seinem Byte.
Zum Kodieren lassen Sie die Richtung auf Text → Quoted-printable und tippen oder fügen den Text ein. Zeichensatz unter der Eingabe bestimmt, zu welchen Bytes Nicht-ASCII-Zeichen werden.
Wie Quoted-Printable funktioniert
Quoted-Printable (RFC 2045, Abschnitt 6.7) lässt Text lesbar, wo es geht, und maskiert nur, was sein muss:
- Druckbare ASCII-Zeichen bleiben unverändert, außer
=. - Jedes andere Byte wird als
=plus zwei Hex-Ziffern in Großbuchstaben geschrieben. In UTF-8 wird so jedes Nicht-ASCII-Zeichen zu zwei bis vier Escape-Sequenzen. =selbst wird zu=3D.- Ein Leerzeichen oder Tab am Zeilenende wird zu
=20bzw.=09. - Zeilen haben höchstens 76 Zeichen. Längere werden mit einem weichen Zeilenumbruch geteilt: einem
=am Zeilenende, das der Decoder wieder entfernt.
| Text | Quoted-printable |
|---|---|
café | caf=C3=A9 |
Grüße aus München | Gr=C3=BC=C3=9Fe aus M=C3=BCnchen |
100% = €5 | 100% =3D =E2=82=AC5 |
<p style="color:red">Hi</p> | <p style=3D"color:red">Hi</p> |
Caf=E9 als ISO-8859-1 dekodiert | Café |
In der letzten Zeile ist =E9 ein einzelnes Byte: é in ISO-8859-1 und Windows-1252, für sich allein in UTF-8 aber ungültig. Das Ergebnis hängt also vom Zeichensatz ab, mit dem Sie dekodieren.
Textmodus und Binärmodus
Standardmäßig behandelt der Encoder die Eingabe als Text. Zeilenumbrüche bleiben echte Zeilenumbrüche, und wie bei Pythons binascii.b2a_qp wird ein späteres einzelnes LF ebenfalls zu CRLF, wenn die erste Zeile auf CRLF endet. Für E-Mail-Text ist das richtig, es verändert aber die Bytes.
Aktivieren Sie Zeilenumbrüche kodieren (binär), wenn es auf die exakten Bytes ankommt. Zeilenumbrüche werden dann als =0D und =0A geschrieben, aus Hello, CRLF, World wird also Hello=0D=0AWorld, und das Dekodieren liefert genau das zurück, was hineinging. Für echte Binärdaten wie Bilder ist Base64 ohnehin die bessere Wahl.
Quoted-Printable oder Base64 in E-Mails
Mailprogramme wählen das Content-Transfer-Encoding für jeden MIME-Teil einzeln. Quoted-Printable passt zu Text, der überwiegend aus ASCII besteht, weil er lesbar bleibt und kaum wächst. Base64 hat einen festen Overhead von etwa 33 % und gewinnt, sobald die meisten Bytes maskiert werden müssen:
| Text | UTF-8-Bytes | Quoted-printable | Base64 |
|---|---|---|---|
Grüße aus München | 20 | 32 Zeichen | 28 Zeichen |
Привет, мир (Russisch) | 20 | 56 Zeichen | 28 Zeichen |
Schon deutscher Text mit drei Nicht-ASCII-Buchstaben auf 17 Zeichen ist in Quoted-Printable größer als in Base64; Kyrillisch ist doppelt so groß wie in Base64. Die Base64-Form mit den 76-Zeichen-Zeilen, die E-Mail verlangt, erzeugt der MIME-Base64-Encoder. Base64 in E-Mails erklärt, wie beide Kodierungen in einer Nachricht auftauchen, auch in Anhängen und kodierten Headern.
Eine ganze E-Mail lesen
Einen einzelnen Body-Teil aus einer Rohnachricht zu kopieren reicht für einen schnellen Blick. Für eine vollständige .eml-Datei parst der E-Mail-Decoder die Header, dekodiert Quoted-Printable- und Base64-Teile mit ihren angegebenen Zeichensätzen und listet Anhänge zum Herunterladen auf. Quoted-Printable kommt auch außerhalb von E-Mails vor, zum Beispiel in vCard-2.1-Dateien mit ENCODING=QUOTED-PRINTABLE; fügen Sie hier den Wert nach dem Doppelpunkt ein.
Quoted-Printable im Code
import quopri
quopri.encodestring("café".encode("utf-8")) # b'caf=C3=A9'
quopri.decodestring(b"caf=C3=A9 =3D 5=E2=82=AC").decode("utf-8") # 'café = 5€'
Pythons Paket email wendet die richtige Dekodierung automatisch an: msg.get_payload(decode=True) liefert die dekodierten Bytes eines Teils, egal welches Transfer-Encoding er verwendet. Die Seite Python behandelt die Base64-Seite.
Häufige Fragen
Was bedeutet =3D in einer E-Mail?
Es ist ein kodiertes Gleichheitszeichen. In Quoted-Printable leitet = eine Escape-Sequenz ein, deshalb muss ein echtes = als =3D geschrieben werden, also als sein Bytewert in Hex. In HTML-Mails sieht man das ständig, etwa in style=3D"color:red".
Warum enden Zeilen im E-Mail-Quelltext mit =?
Das ist ein weicher Zeilenumbruch. Quoted-Printable-Zeilen dürfen höchstens 76 Zeichen lang sein, längere Zeilen werden daher geteilt und jede Trennstelle mit einem = am Zeilenende markiert. Ein Decoder fügt die Teile wieder zu einer Zeile zusammen.
Was bedeutet =20 am Ende einer Zeile?
Ein kodiertes Leerzeichen. Mailsysteme dürfen Leerzeichen am Zeilenende entfernen, deshalb schützt Quoted-Printable ein Leerzeichen oder einen Tab am Zeilenende, indem es ihn als =20 bzw. =09 schreibt.
Wie dekodiere ich Quoted-Printable in Python?
quopri.decodestring(data) oder binascii.a2b_qp(data) liefern Bytes; rufen Sie danach .decode("utf-8") auf oder den Zeichensatz, den der Header Content-Type nennt.
Kann das Tool Betreffzeilen wie =?UTF-8?Q?...?= dekodieren?
Nicht auf dieser Seite. Das sind Encoded Words nach RFC 2047, die eine verwandte Q-Kodierung mit _ für Leerzeichen verwenden. Der E-Mail-Decoder dekodiert sie in Headern, zusammen mit Quoted-Printable-Inhalten.