W3docs

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.

Avertissement

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ètreDescription
$stringLa 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

php— editable, runs on the server

Le résultat est :

5a6feb

Les 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.

Pratique

Pratique
Que fait la fonction utf8_decode en PHP ?
Que fait la fonction utf8_decode en PHP ?
Was this page helpful?