utf8_decode()
La fonction utf8_decode() convertit une chaîne UTF-8 en encodage ISO-8859-1 en PHP. Découvrez sa syntaxe, ses exemples et son alternative moderne.
La fonction utf8_decode() est une fonction intégrée de PHP qui convertit une chaîne encodée en UTF-8 vers ISO-8859-1 (aussi appelé Latin-1). UTF-8 peut représenter tous les caractères Unicode, tandis qu'ISO-8859-1 est un encodage sur un octet qui ne couvre que les 256 premiers points de code Unicode (lettres d'Europe occidentale, chiffres et ponctuation).
Cette page explique ce que fait utf8_decode(), quand vous en avez réellement besoin, son remplacement moderne, et comment elle se comporte avec les caractères qui ne font pas partie d'ISO-8859-1.
Quand (et si) l'utiliser
Vous n'avez besoin de utf8_decode() que lorsque vous transmettez du texte UTF-8 à un système plus ancien qui ne comprend que l'ISO-8859-1 — par exemple une colonne de base de données legacy, un rapport à largeur fixe, ou une API tierce antérieure à Unicode. Pour tout nouveau projet, gardez vos données en UTF-8 de bout en bout et vous n'aurez jamais besoin de cette fonction.
utf8_decode() est dépréciée depuis PHP 8.2 et sera supprimée dans une version future. Remplacez-la par mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8') (l'extension mbstring) ou iconv('UTF-8', 'ISO-8859-1', $string). La conversion inverse est effectuée par utf8_encode().
Une limitation importante : ISO-8859-1 ne dispose d'aucun emplacement pour des caractères tels que €, ™, les emoji, ou tout script non-latin. Lorsque utf8_decode() rencontre un caractère qu'elle ne peut pas représenter, elle le remplace par un point d'interrogation (?) — le caractère original est perdu. C'est pourquoi la fonction est avec pertes et pourquoi rester en UTF-8 est presque toujours le meilleur choix.
Syntaxe
La syntaxe de la fonction utf8_decode() est la suivante :
utf8_decode(string $string): string| Paramètre | Description |
|---|---|
$string | La chaîne encodée en UTF-8 à convertir en ISO-8859-1. |
Valeur de retour : la chaîne ISO-8859-1 convertie. Les octets qui ne constituent pas du UTF-8 valide, et les caractères n'ayant pas d'équivalent en ISO-8859-1, sont remplacés par un point d'interrogation (?).
Exemples d'utilisation
Voyons quelques exemples pratiques de l'utilisation de utf8_decode() en PHP.
Exemple 1 : Conversion d'un texte encodé UTF-8 en ISO-8859-1
La chaîne "Zoë" est stockée dans votre script en UTF-8, où le ë occupe deux octets (c3 ab). Après le décodage, ë devient l'octet ISO-8859-1 unique eb. Nous affichons les octets bruts avec bin2hex() pour que le changement au niveau des octets soit visible :
Conversion d'un texte encodé UTF-8 en ISO-8859-1 en PHP
Le résultat est :
5a6febLes quatre octets UTF-8 (Z, o, et le ë sur deux octets) se réduisent à trois octets ISO-8859-1 : 5a (Z), 6f (o) et eb (ë). La chaîne est maintenant d'un octet plus courte car le caractère accentué est encodé sur un seul octet au lieu de deux.
Exemple 2 : Caractères ne pouvant pas être représentés
Comme ISO-8859-1 ne dispose que de 256 points de code, tout caractère en dehors de cette plage est perdu. Le signe euro (€) en est un exemple classique — il n'existe pas en Latin-1 :
<?php
echo utf8_decode("Price: €5"); // Price: ?5
?>Le € est remplacé par ?. Si vous devez conserver des caractères comme celui-ci, ne convertissez pas vers ISO-8859-1 — conservez le texte en UTF-8, ou utilisez un encodage cible plus riche.
Exemple 3 : Lecture d'un texte UTF-8 depuis XML
SimpleXML analyse toujours le XML en UTF-8. Si vous devez transmettre ce texte à un système Latin-1, décodez chaque valeur au moment de la lecture avec simplexml_load_file() :
Conversion d'un texte encodé UTF-8 depuis XML en PHP
<?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";
}
?>Ce code charge data.xml, parcourt chaque élément <item>, et décode le texte de <title> et <description> de UTF-8 vers ISO-8859-1. Le cast de chaque nœud en (string) transforme d'abord le SimpleXMLElement en chaîne simple avant le décodage.
Pour que cet exemple fonctionne, data.xml doit contenir une structure comme celle-ci :
<root>
<item>
<title>Example Title</title>
<description>Example Description</description>
</item>
</root>Conclusion
utf8_decode() convertit du texte UTF-8 en ISO-8859-1, en supprimant tout caractère que Latin-1 ne peut pas représenter. Elle est pratique pour communiquer avec des systèmes legacy, mais elle est dépréciée depuis PHP 8.2+ et avec pertes, il vaut donc mieux utiliser mb_convert_encoding() ou iconv() et garder vos données en UTF-8 dans la mesure du possible.
Pour effectuer la conversion inverse, consultez utf8_encode(). Pour en savoir plus sur le traitement du texte en PHP, consultez la référence des fonctions de chaînes PHP.