Meine Herren!
Sorry, ich vergaß zu erwähnen, dass es auch noch
mb_check_encoding($str, 'UTF-8');
Beide Funktionen sind für den vorliegenden Fall kein Lösungsansatz.
Ich versuche mich nochmal ganz langsam zu erklären:
utf8_encode()
hat einen schlechten Namen, die Funktion sollte eigentlich convert_from_ISO_8859_1_to_UTF8 oder so heißen. Denn das ist genau was utf8_encode()
macht: Sie konvertiert von ISO_8859-1 nacht UTF8. Ob die Eingabe dabei wirklich ISO_8859-1 ist oder nicht, kümmert die Funktion nicht, die ist im Automodus, macht einfach das, was sie tun soll. Man kann sie sich wie einen dummen Roboter vorstellen, der Briefe frankieren soll, der Roboter prüft aber nicht, ob schon eine Briefmarke auf dem Umschlag klebt, er klebt einfach immer wieder eine neue drauf. Im Falle von utf8_encode()
kann dadurch aber der Text verstümmelt werden, wenn die Eingabe schon UTF8 ist (schon eine Marke auf dem Brief klebt) und trotzdem wieder konvertiert wird (noch eine Marke auf den Umschlag kommt). Das macht zwei Marken auf dem Umschlag.
Hier eine kleine Illustration.
echo 'ä';
echo utf8_encode( 'ä' );
echo utf8_encode( utf8_encode( 'ä' ) );
echo utf8_encode( utf8_encode( utf8_encode( 'ä' ) ) );
(Ich konnte das Beispiel leider nicht mit der erzeugeten Ausgabe hier im Forum posten, deswegen seid ihr genötigt, den Code selbst zu testen, zum Beispiel mit dem http://phpcodepad.com/)
Die Ausgabe wird jedenfalls immer länger und unleserlicher, aber trotzdem ist die Ausgabe immer eine korrekt kodierte UTF8-Zeichenkette. Und die Funktionen mb_check_encoding()
und seems_utf8()
werden sie immer als korrekte UTF8-Zeichenkette auffassen.
mb_check_encoding( utf8_encode( 'ä' ), 'UTF-8');
mb_check_encoding( utf8_encode( utf8_encode( 'ä' ) ), 'UTF-8');
mb_check_encoding()
und seems_utf8()
arbeiten korrekt, aber für dieses Problem hilft uns das leider nicht weiter.
Eine robuste Methode, um eine solche Mehrfach-Kodierung zu erkennen, ist mir nicht bekannt.
--
“All right, then, I'll go to hell.” – Huck Finn