utf8_decode()
Die Funktion utf8_decode() ist eine PHP-Funktion, die einen String von UTF-8-Kodierung in ISO-8859-1-Kodierung umwandelt.
Die Funktion utf8_decode() ist eine in PHP eingebaute Funktion, die einen String von der UTF-8-Kodierung in ISO-8859-1 (auch Latin-1 genannt) umwandelt. UTF-8 kann jedes Unicode-Zeichen darstellen, während ISO-8859-1 eine Einzelbyte-Kodierung ist, die nur die ersten 256 Unicode-Codepunkte abdeckt (westeuropäische Buchstaben, Ziffern und Satzzeichen).
Diese Seite erläutert, was utf8_decode() tut, wann Sie die Funktion tatsächlich benötigen, den modernen Ersatz und das Verhalten bei Zeichen, die außerhalb von ISO-8859-1 liegen.
Wann (und ob) sie verwendet werden sollte
Sie benötigen utf8_decode() nur, wenn Sie UTF-8-Text in ein älteres System einspeisen, das ausschließlich ISO-8859-1 versteht — zum Beispiel eine veraltete Datenbankspalte, einen Bericht mit fester Breite oder eine Drittanbieter-API aus der Zeit vor Unicode. Für alles Neue sollten Sie Ihre Daten durchgängig in UTF-8 halten, und Sie werden diese Funktion nie benötigen.
utf8_decode() ist ab PHP 8.2 veraltet und wird in einer zukünftigen Version entfernt. Ersetzen Sie sie durch mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8') (die mbstring-Erweiterung) oder iconv('UTF-8', 'ISO-8859-1', $string). Die entgegengesetzte Konvertierung wird durch utf8_encode() durchgeführt.
Eine wesentliche Einschränkung: ISO-8859-1 hat keinen Platz für Zeichen wie €, ™, Emoji oder beliebige nicht-lateinische Schriften. Wenn utf8_decode() auf ein Zeichen trifft, das es nicht darstellen kann, ersetzt es dieses durch ein Fragezeichen (?) — das ursprüngliche Zeichen geht verloren. Deshalb ist die Funktion verlustbehaftet und das Beibehalten von UTF-8 fast immer die bessere Wahl.
Syntax
Die Syntax der Funktion utf8_decode() lautet wie folgt:
utf8_decode(string $string): string| Parameter | Beschreibung |
|---|---|
$string | Der UTF-8-kodierte String, der in ISO-8859-1 umgewandelt werden soll. |
Rückgabewert: der konvertierte ISO-8859-1-String. Bytes, die kein gültiges UTF-8 sind, und Zeichen ohne ISO-8859-1-Entsprechung werden in ein Fragezeichen (?) umgewandelt.
Verwendungsbeispiele
Schauen wir uns einige praktische Beispiele für die Verwendung von utf8_decode() in PHP an.
Beispiel 1: UTF-8-kodierten Text in ISO-8859-1 umwandeln
Der String "Zoë" ist in Ihrem Skript als UTF-8 gespeichert, wobei das ë zwei Bytes (c3 ab) belegt. Nach der Dekodierung wird ë zum einzelnen ISO-8859-1-Byte eb. Wir geben die rohen Bytes mit bin2hex() aus, damit die Änderung auf Byte-Ebene sichtbar ist:
UTF-8-kodierten Text in ISO-8859-1 in PHP umwandeln
Die Ausgabe ist:
5a6febDie vier UTF-8-Bytes (Z, o und das zweibytige ë) werden auf drei ISO-8859-1-Bytes reduziert: 5a (Z), 6f (o) und eb (ë). Der String ist nun ein Byte kürzer, da das Zeichen mit Akzent in einem einzigen Byte statt in zwei kodiert ist.
Beispiel 2: Zeichen, die nicht dargestellt werden können
Da ISO-8859-1 nur 256 Codepunkte hat, gehen alle Zeichen außerhalb dieses Bereichs verloren. Das Eurozeichen (€) ist ein klassisches Beispiel — es existiert nicht in Latin-1:
<?php
echo utf8_decode("Price: €5"); // Price: ?5
?>Das € wird durch ? ersetzt. Wenn Sie Zeichen wie dieses erhalten möchten, konvertieren Sie nicht nach ISO-8859-1 — behalten Sie den Text in UTF-8, oder verwenden Sie eine reichhaltigere Zielkodierung.
Beispiel 3: UTF-8-Text aus XML lesen
SimpleXML parst XML immer als UTF-8. Wenn Sie diesen Text an ein Latin-1-System übergeben müssen, dekodieren Sie jeden Wert beim Lesen mit simplexml_load_file():
UTF-8-kodierten Text aus XML in PHP umwandeln
<?php
$xml = simplexml_load_file("data.xml");
foreach ($xml->item as $item) {
$title = utf8_decode((string) $item->title);
$description = utf8_decode((string) $item->description);
echo "$title: $description\n";
}
?>Dies lädt data.xml, durchläuft jedes <item>-Element und dekodiert den Text von <title> und <description> von UTF-8 nach ISO-8859-1. Jedes Element wird zuerst mit (string) in einen einfachen String umgewandelt, bevor es dekodiert wird.
Damit dieses Beispiel funktioniert, sollte data.xml eine Struktur wie diese enthalten:
<root>
<item>
<title>Example Title</title>
<description>Example Description</description>
</item>
</root>Fazit
utf8_decode() wandelt UTF-8-Text in ISO-8859-1 um und verwirft dabei alle Zeichen, die Latin-1 nicht darstellen kann. Die Funktion ist nützlich für die Kommunikation mit Legacy-Systemen, ist jedoch ab PHP 8.2+ veraltet und verlustbehaftet. Bevorzugen Sie daher mb_convert_encoding() oder iconv() und halten Sie Ihre Daten wann immer möglich in UTF-8.
Für die entgegengesetzte Richtung, siehe utf8_encode(). Für mehr über die Arbeit mit Text in PHP, lesen Sie die Referenz zu PHP-String-Funktionen.