Comment résoudre les problèmes d'accents en PHP ?

Réponses rédigées par Antoine
Dernière mise à jour : 2020-01-26 17:50:06
Thèmes : webmaster - php - accents
Question

Je n'arrive pas à comprendre comment fonctionne la gestion des accents en PHP, parfois j'ai des caractères bizarres, ou un point d’interrogation à la place des caractères accentués. Comment résoudre les problèmes d'accents en PHP ?

Réponse

Une bonne gestion des accents en PHP dépend d'une bonne compréhension et d'une homogénéité de l'encodage des caractères : vous devez spécifier quel encodage vous allez utiliser ; et cet encodage doit être spécifié à différents endroits : au niveau du fichier PHP lui-même, dans le code HTML, dans le code PHP si celui-ci ne contient pas de code HTML avec les balises <meta>, au niveau de la structure de votre base de données.

De nos jours l'encodage le plus utilisé sur le Web est l'UTF-8, prenons donc cet exemple.

Il vous faut tout d'abord vérifier l'encodage du fichier PHP. Selon le logiciel que vous utilisez pour ouvrir et visionner votre code, celui-ci doit disposer d'un menu Encodage ; définissez ainsi l'encodage sur la valeur UTF-8.

Exemple avec l'éditeur de code Notepad++ :

Il vous faut ensuite spécifier le type d'encodage au niveau des en-têtes HTML, pour cela on utilise une balise <meta>.

<meta charset="utf-8">

Pour les codes source PHP qui ne contiennent pas d'en-têtes HTML, tels que des fichiers XML, appels AJAX, JSON, ou autres, vous devez utiliser la fonction header PHP pour ainsi déclarer l'encodage utilisé :

<?php header("Content-Type: text/html; charset=utf-8"); ?>

Concernant les données provenant d'une base de données, vous devez vérifier l'encodage déclaré dans la structure de la base ; pour une base de données du type MySQL on parle d’interclassement. Si vous êtes amené à créer un base de données où seront stockés des textes en français, privilégiez un interclassement du type utf8_roman_ci, il respecte le classement des caractères accentués et des caractères liés.

Après avoir vérifié ces différents niveaux d'encodage, et si vous devez faire face à des encodages non homogènes et à des accents qui s'affichent sous la forme de caractères bizarres du type é ou encore � , vous disposez de plusieurs fonctions PHP pour transcrire des caractères d'un encodage à un autre :

  • mysqli_set_charset permet de définir le jeu de caractères par défaut des requêtes MySQL.
  • utf8_encode permet de convertir une chaîne ISO-8859-1 en UTF-8.
  • utf8_decode permet de convertir une chaîne UTF-8 en ISO-8859-1.
  • htmlentities permet de convertir tous les caractères éligibles en entités HTML.