Discussion:
mb_encode_mimeheader und utf-8
(zu alt für eine Antwort)
Stefan+ (Stefan Froehlich)
2004-12-16 11:52:54 UTC
Permalink
Hallo,

gerade eben hatte ich die Aufgabe, UTF-8 Zeichenketten per Mail zu
verschicken. An sich kein Problem, bis auf die Header (From, Cc, Subject),
bei denen man entsprechend codieren muss. Nun gibt es dafuer an sich die
Funktion mb_encode_mimeheader, in meiner Naivitaet habe ich sie mit

| $result = mb_encode_mimeheader($string, 'UTF-8', 'Q');

aufgerufen ($string enthaelt dabei nach utf-8 codierte Zeichen). Das
Ergebnis war hoechst irritierend, aus "äöü" wird:

| =?UTF-8?Q?=C3=83=C2=A4=C3=83=C2=B6=C3=83=C2=BC?=

Setzt man hingegen den Zeichensatz auf 'ISO-8859-1', erhaelt man das, was
man erwartet:

| $result = mb_encode_mimeheader($string, 'ISO-8859-1', 'Q');
| =?ISO-8859-1?Q?=C3=A4=C3=B6=C3=BC?=

Die Funktion QP-codiert also nicht nur, sondern konvertiert auch noch ganz
unaufgefordert die (ohnehin bereits codierten) Zeichen. Welche Trivialitaet
habe ich uebersehen, um das abzustellen?

Im Moment behelfe ich mir mit

| $result = mb_encode_mimeheader($string, 'ISO-8859-1', 'Q');
| $result = preg_replace('/ISO-8859-1/', 'UTF-8', $result);

was zwar nun ganz ausgezeichnet funktioniert, aber wirklich hoechst
unelegant ist. Zweckdienliche Hinweise, wie ich diesen Workaround wieder
loswerde, werden gerne entgegengenommen...

Servus,
Stefan
--
http://kontaktinser.at/ - kostenlose Kontaktanzeigen fuer Österreich

Richtungsweisend bleibt richtungsweisend: Stefan braucht diese Welt!
(Sloganizer)
Christoph Päper
2004-12-16 13:58:55 UTC
Permalink
Post by Stefan+ (Stefan Froehlich)
gerade eben hatte ich die Aufgabe, UTF-8 Zeichenketten per Mail zu
verschicken. An sich kein Problem, bis auf die Header
In den Headern würde ich eher auf Transkription setzen ('ä'->'ae' etc.),
wenn es um eine Sprache wie Deutsch geht, in der das kaum auffällt. Aber
wenn es um Deutsch ginge, würdest du vermutlich gar nicht *generell* UTF-8
einsetzen wollen.
Post by Stefan+ (Stefan Froehlich)
| $result = mb_encode_mimeheader($string, 'UTF-8', 'Q');
Was gibt denn

print mb_internal_encoding();

aus?
Post by Stefan+ (Stefan Froehlich)
($string enthaelt dabei nach utf-8 codierte Zeichen)
Ganz sicher?
Post by Stefan+ (Stefan Froehlich)
| =?UTF-8?Q?=C3=83=C2=A4=C3=83=C2=B6=C3=83=C2=BC?
Da wurde doppelt UTF-8-kodiert (mit ISO-8859-1 als Zwischenstufe), wie du
mit 'mb_decode_mimeheader()' und 'mb_convert_encoding()' leicht nachprüfen
kannst.
Post by Stefan+ (Stefan Froehlich)
Setzt man hingegen den Zeichensatz auf 'ISO-8859-1', erhaelt man das, was
Das führt zu der Vermutung, dass "$string" ISO-8859-1-kodiert war.
Post by Stefan+ (Stefan Froehlich)
| $result = mb_encode_mimeheader($string, 'ISO-8859-1', 'Q');
| =?ISO-8859-1?Q?=C3=A4=C3=B6=C3=BC?
Das ist nicht, was »man« erwarten würde, sondern der erst UTF-8- dann
ISO-8859-1- und schließlich QP-kodierte String 'äöü', d.h. Mehrbytezeichen
werden fälschlicherweise als 8-Bit-Codes behandelt.
Nur ISO-8859-1- und QP-kodiert sähe es so aus:

=?ISO-8859-1?Q?=E4=F6=FC?
Nur UTF-8 und QP so (aber das scheinst du schon zu wissen wie dein
wirklich hässlicher Workaround zeigt):

=?UTF-8?Q?=C3=A4=C3=B6=C3=BC?=
--
»Die Kunst spiegelt nicht das Leben, sondern den Betrachter.«

Oscar Wilde
Stefan+ (Stefan Froehlich)
2004-12-16 17:37:27 UTC
Permalink
Post by Christoph Päper
In den Headern würde ich eher auf Transkription setzen ('ä'->'ae'
etc.), wenn es um eine Sprache wie Deutsch geht, in der das kaum
auffällt.
Aber wenn es um Deutsch ginge, würdest du vermutlich gar
nicht *generell* UTF-8 einsetzen wollen.
...geht es ohnehin um (mindestens) deutsche und tschechische Mails,
deren Inhalt zu allem Ueberfluss auch noch frei eingegeben werden
kann.
Post by Christoph Päper
Post by Stefan+ (Stefan Froehlich)
| $result = mb_encode_mimeheader($string, 'UTF-8', 'Q');
Was gibt denn
print mb_internal_encoding();
aus?
Hrmpf. Das Ergebnis davon in Verbindung damit, dass Du ueberhaupt
danach gefragt hast, fuehrte dann auch bereits direkt zur Loesung,
danke.

Ich finde das Verhalten nur ziemlich eigenwillig.
mb_encode_mimeheader() sagt in der Dokumentation:

| string mb_encode_mimeheader ( string str [, string charset [, string
| transfer_encoding [, string linefeed]]])
|
[...]
| charset specifies the name of the character set in which str is
| represented in. The default value is determined by the current NLS
| setting (

Und daraus folgt IMHO ganz zweifelsfrei und eindeutig, dass man
durch entsprechende Angabe von charset den Quellzeichensatz
einstellen kann. Das ist allerdings nicht richtig, man kann
lediglich den Ausgabezeichensatz damit beeinflussen ("in which the
result will be represented in" traefe es besser).
Post by Christoph Päper
Post by Stefan+ (Stefan Froehlich)
Setzt man hingegen den Zeichensatz auf 'ISO-8859-1', erhaelt man das, was
Das führt zu der Vermutung, dass "$string" ISO-8859-1-kodiert war.
Post by Stefan+ (Stefan Froehlich)
| $result = mb_encode_mimeheader($string, 'ISO-8859-1', 'Q');
| =?ISO-8859-1?Q?=C3=A4=C3=B6=C3=BC?
Das ist nicht, was »man« erwarten würde,
...es ist insoferne das, was ich erwartet hatte, weil ich der
Funktion 6 Bytes mit dem Label "ISO-8859-1" verfuettert hatte. Die
Bytes sind ja nicht ungueltig, sondern bloss nicht das, was man
als menschlicher Betrachter vermuten wuerde, und sie werden
einwandfrei konvertiert.
Post by Christoph Päper
Nur UTF-8 und QP so (aber das scheinst du schon zu wissen wie dein
=?UTF-8?Q?=C3=A4=C3=B6=C3=BC?=
Jupp (und zeichensatztheoretisch habe ich ganz sicher keine
Probleme, es ging lediglich um das exakte Verhalten der mb_*
Funktionen). Die Tuecke ist halt die versteckte Konvertierung von
"str", die unter mb_encode_mimeheader() nicht erwaehnt wird (auf
mb_internal_encoding() sehr wohl, aber dazu muss man erst einmal auf
die Idee kommen, dort ueberhaupt nachzulesen).

Servus,
Stefan
--
http://kontaktinser.at/ - kostenlose Kontaktanzeigen fuer Österreich

Stefan - gezierte Racker kauft Deutschland!
(Sloganizer)
Mario Mueller
2004-12-16 14:38:25 UTC
Permalink
Post by Stefan+ (Stefan Froehlich)
Nun gibt es dafuer an sich die
Funktion mb_encode_mimeheader, in meiner Naivitaet habe ich sie mit
| $result = mb_encode_mimeheader($string, 'UTF-8', 'Q');
aufgerufen ($string enthaelt dabei nach utf-8 codierte Zeichen). Das
| =?UTF-8?Q?=C3=83=C2=A4=C3=83=C2=B6=C3=83=C2=BC?=
Wahrscheinlich ist die interne Kodierung auf ISO-8859-1 gestellt. Setz
das vorher mal auf UTF-8.

ini_set('mbstring.internal_encoding', 'UTF-8');

m.m
--
Fremdsprachen Online Lernen http://www.lingo4u.de/
Loading...