Caractères accentués : UTF-8, entités HTML et codes
Aujourd'hui, la règle est simple : on écrit les accents tels quels (é, à, ç, œ…) et on laisse l'UTF-8 faire le travail. Pour que cela fonctionne, il faut que le fichier soit enregistré en UTF-8 et que la page le déclare :
<meta charset="utf-8">
Le serveur peut aussi l'annoncer dans l'en-tête de la réponse : Content-Type: text/html; charset=UTF-8. Les codes ci-dessous ne servent que pour les cas où l'on ne peut pas taper le caractère directement.
Les caractères du français et leurs codes
Pour chaque caractère : son entité HTML, son numéro Unicode et ses octets en UTF-8 (en hexadécimal). Les entités HTML fonctionnent quel que soit l'encodage de la page.
Minuscules
| Caractère | Entité HTML | Code décimal | Unicode | Octets UTF-8 |
|---|---|---|---|---|
| à | à |
à |
U+00E0 |
C3 A0 |
| â | â |
â |
U+00E2 |
C3 A2 |
| ä | ä |
ä |
U+00E4 |
C3 A4 |
| é | é |
é |
U+00E9 |
C3 A9 |
| è | è |
è |
U+00E8 |
C3 A8 |
| ê | ê |
ê |
U+00EA |
C3 AA |
| ë | ë |
ë |
U+00EB |
C3 AB |
| î | î |
î |
U+00EE |
C3 AE |
| ï | ï |
ï |
U+00EF |
C3 AF |
| ô | ô |
ô |
U+00F4 |
C3 B4 |
| ö | ö |
ö |
U+00F6 |
C3 B6 |
| ù | ù |
ù |
U+00F9 |
C3 B9 |
| û | û |
û |
U+00FB |
C3 BB |
| ü | ü |
ü |
U+00FC |
C3 BC |
| ç | ç |
ç |
U+00E7 |
C3 A7 |
| œ | œ |
œ |
U+0153 |
C5 93 |
| ÿ | ÿ |
ÿ |
U+00FF |
C3 BF |
Majuscules
| Caractère | Entité HTML | Code décimal | Unicode | Octets UTF-8 |
|---|---|---|---|---|
| À | À |
À |
U+00C0 |
C3 80 |
| Â | Â |
 |
U+00C2 |
C3 82 |
| Ä | Ä |
Ä |
U+00C4 |
C3 84 |
| É | É |
É |
U+00C9 |
C3 89 |
| È | È |
È |
U+00C8 |
C3 88 |
| Ê | Ê |
Ê |
U+00CA |
C3 8A |
| Ë | Ë |
Ë |
U+00CB |
C3 8B |
| Î | Î |
Î |
U+00CE |
C3 8E |
| Ï | Ï |
Ï |
U+00CF |
C3 8F |
| Ô | Ô |
Ô |
U+00D4 |
C3 94 |
| Ö | Ö |
Ö |
U+00D6 |
C3 96 |
| Ù | Ù |
Ù |
U+00D9 |
C3 99 |
| Û | Û |
Û |
U+00DB |
C3 9B |
| Ü | Ü |
Ü |
U+00DC |
C3 9C |
| Ç | Ç |
Ç |
U+00C7 |
C3 87 |
| Œ | Œ |
Œ |
U+0152 |
C5 92 |
| Ÿ | Ÿ |
Ÿ |
U+0178 |
C5 B8 |
Ponctuation et symboles
| Caractère | Entité HTML | Code décimal | Unicode | Octets UTF-8 |
|---|---|---|---|---|
| « | « |
« |
U+00AB |
C2 AB |
| » | » |
» |
U+00BB |
C2 BB |
| ’ | ’ |
’ |
U+2019 |
E2 80 99 |
| … | … |
… |
U+2026 |
E2 80 A6 |
| € | € |
€ |
U+20AC |
E2 82 AC |
| ° | ° |
° |
U+00B0 |
C2 B0 |
Taper un accent qui n'est pas sur le clavier
- Windows : maintenez la touche
Altet tapez le code sur le pavé numérique :Alt+0201donne É,Alt+0192À,Alt+0199Ç,Alt+0140Œ etAlt+0156œ. - macOS : maintenez une lettre enfoncée : un menu propose ses variantes accentuées.
- Linux (applications GTK) :
Ctrl+Maj+U, puis le code Unicode sans le « U+ », puisEntrée:Ctrl+Maj+U,00c9,Entréedonne É.
Quand utiliser une entité HTML
Quatre caractères doivent toujours être écrits sous forme d'entités dans le texte d'une page, car le navigateur leur donne un sens : & pour &, < pour <, > pour > et " pour un guillemet dans un attribut. En PHP, htmlspecialchars($texte, ENT_QUOTES, 'UTF-8') s'en charge. Pour les lettres accentuées, l'entité n'est utile que si le fichier n'est pas en UTF-8 ou si l'outil d'édition ne sait pas gérer ce caractère.
Des « é » à la place des accents
Quand un texte en UTF-8 est lu comme s'il était en Windows-1252 ou en ISO-8859-1, chaque caractère accentué, qui occupe deux ou trois octets, s'affiche sous la forme de deux ou trois caractères bizarres :
| Texte voulu | Texte affiché |
|---|---|
| é | é |
| è | è |
| à | Ã |
| ç | ç |
| ê | ê |
| ô | ô |
| ù | ù |
| û | û |
| î | î |
| œ | Å“ |
| ’ | ’ |
| € | € |
Pour corriger le problème, vérifiez dans l'ordre :
- le fichier est enregistré en UTF-8, de préférence sans BOM ;
- la page déclare
<meta charset="utf-8">, ou le serveur envoiecharset=UTF-8; - la base de données et la connexion sont en
utf8mb4(avec PDO :mysql:host=…;dbname=…;charset=utf8mb4) ; - le texte n'est pas converti deux fois : appliquer une conversion UTF-8 sur un texte qui l'est déjà produit justement ces « é ».
En PHP, les fonctions utf8_encode() et utf8_decode() sont obsolètes depuis PHP 8.2 : elles ne savent convertir que depuis et vers l'ISO-8859-1. Utilisez mb_convert_encoding($texte, 'UTF-8', 'ISO-8859-1') en précisant l'encodage d'origine.