Moin!
Unter der Vorraussetzung, dass das Skript in UTF-8 gespeichert ist, wandern in dieser Konstellation ISO-8859-1-Umlaute in die Betreffzeile, obwohl es keine strikten ASCII-Zeichen sind.
Um ehrlich zu sein ... ich weiß nicht, wovon Du sprichst. Ich habe bisher Alles, was mit utf-8 zu tun hat, nur sehr suspekt verstanden. Ich verstehe das ganze Technik-Sprech bei all den Erklärungen einfach nicht.
Eine Zeichencodierung ist eine Zuordnung, welches Byte bzw. welche Bytekombination für welches menschliche Buchstabenzeichen steht. Wenn man Text tippt, wird aus dem eingegebenen Zeichen eine Bytekombination erstellt, und wenn diese Bytes wieder als Text dargestellt werden, wird anhand der Zuordnung wieder ermittelt, welches Zeichen darzustellen ist.
Praktisch, aber auch problematisch, ist die Tatsache, dass für die meisten Codierungen gilt, dass sehr viele Bytezuordnungen identisch sind. Man bemerkt also nur anhand der eher selten auftretenden abweichenden Zeichenzuordnungen, dass etwas falsch gelaufen ist. Oder eben daran, dass die gewählte Codierung irgendwo angegeben ist.
Alles, was nicht ASCII (Code 0 bis 127) ist, ist in Mailheadern böse und muss durch Encodingangaben entschärft werden. Die fehlt bei dir.
ASCII ist ein 7-Bit-Zeichensatz. Der wurde als Grundlage genommen für das Mailprotokoll SMTP.
Das stimmt nicht, dafür ist ja das "Content-Transfer-Encoding" da. (Siehe den Link von dedlfix.)
Mailheader sind etwas anderes, als der Mailbody. Wenn du den Link nochmal genau anschaust, dann steht dort eindeutig, das sich "Content-Transfer-Encoding" auf den Mailbody bezieht, nicht auf den Mailheader.
Weil der Mailheader dem Empfänger grundlegende Informationen liefert, wie der Mailbody zu verstehen ist, dürfen diese Informationen nicht schon in potentiell unverständlichen Codierungen geliefert werden. Wenn bei dir ein Chinese anruft und auf chinesisch fragt "Ich spreche jetzt chinesisch mit ihnen, ist das OK?", dann wirst du das schlicht nicht verstehen. Fragt er hingegen in einer international verständlichen Sprache, würdest du es verstehen und könntest den chinesischen Dolmetscher dazwischenschalten.
Der Mailheader erlaubt keinerlei andere Zeichen als nur 7-Bit-ASCII im SMTP-Dialog. Das Subject ist ebenfalls Bestandteil des Mailheaders. Also dürfen darin auch nur 7-Bit-ASCII-Zeichen vorkommen. Alle anderen Zeichen müssen so umgeformt werden, dass sie diese Forderung erfüllen. Dazu ist im Link von dedlfix aber auch Info enthalten.
Doppelt böse dürfte es dann sein, dass der Mailbody dann noch in einem komplett anderen Encoding auftritt, als der Subject-Header.
Das stimmt doch gar nicht, wie kommst Du da drauf? Beides ist eindeutig utf-8!
Erstens: Der Mailheader darf nur 7-Bit-ASCII sein, ein darin befindliches UTF-8-Umlautzeichen verstößt gegen diese Forderung.
Zweitens: Du dekodierst extra den UTF-8-Betreff in ISO-8859-1 - danach ist der Betreff also nicht mehr UTF-8, sondern ISO-8859-1. Das kann man so machen, aber auch ISO-8859-1 erfordert zwingend, das alle Zeichen, die nicht in 7-Bit-ASCII vorkommen, codiert werden müssen.
Nur für den Body kannst du durch die Angaben "Content-type" und "Content-transfer-encoding" im Mailheader global das Encoding und die Verwendung von 8-Bit-Zeichen angeben und musst dich dann um nichts mehr kümmern.
Hier ist ein Beispiel angedeutet: http://forum.de.selfhtml.org/archiv/2008/2/t166627/#m1087923
Zusätzlich haben die php Ressourcen einen utf8-header:
header("Content-type:text/html;charset=utf-8");
Irrelevant, weil dieser Header ja nicht in der versendeten Mail auftaucht, sondern an den Browser geht. Es ist allerdings hilfreich, das alles auf UTF-8 ausgerichtet ist.
> \_und\_ sind utf-8 codiert gespeichert.
Dito.
- Sven Rautenberg