Afin que les caractères spéciaux contenus dans une chaîne de caractères soient correctement interprétés par les navigateurs, on recourt à la fonction htmlentities(), qui les convertit dans le code HTML correspondant (ce qui permet, soit dit en passant, de coder conformément aux standards).
Or, cette fonction pèche par insuffisance, en ce sens que certains caractères spéciaux ne sont pas convertis et demeurent affichés tels quels dans le code de la page. Ces caractères spéciaux "récalcitrants" sont ceux dont le code ISO est inférieur à 160 (code correspondant à l'espace insécable ), parmi lesquels deux caractères que nous, développeurs francophones, sommes appelés à utiliser: "Œ" et "œ", sans compter le symbole euro "€".
La solution que je propose consiste à créer une fonction qui complète htmlentities() en palliant ses insuffisances.
<?php
function encodage_html($chaine){
// Utilisation de la fonction htmlentities() pour convertir les caractères spéciaux qu'elle peut faire
$chaine=htmlentities($chaine);
// Création d'un tableau groupant les caractères spéciaux problématiques (j'en ai sélectionné 20, mais d'autres peuvent compléter ce tableau)
$caracteres_non_codes=array('Œ', 'œ', 'Ÿ', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '•', '…', '‰', '‹', '›', '€', '™');
// Création d'un autre tableau groupant les codes HTML respectifs de ces caractères
$caracteres_codes=array('Œ', 'œ', 'Ÿ', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '•', '…', '‰', '‹', '›', '€', '™');
// On remplace les valeurs du premier tableau par ceux du second avec la fonction str_replace()
$encodage_html=str_replace($caracteres_non_codes, $caracteres_codes, $chaine);
// On retourne le résultat
return $encodage_html;
}
?>
Un exemple montrant la différence entre une chaîne non convertie, convertie avec htmlentities() seule et convertie avec la fonction créée.<?php
$phrase='Quand je fais du PHP, je n’écoute que mon cœur…'; // La phrase se finit par de vrais points de suspension, ceux qu'affiche automatiquement Word
echo $phrase; // Affiche dans le code source de la page 'Quand je fais du PHP, je n’écoute que mon cœur…'
echo htmlentities($phrase); // Affiche dans le code source de la page 'Quand je fais du PHP, je n’écoute que mon cœur…'
echo encodage_html($phrase); // Affiche dans le code source de la page 'Quand je fais du PHP, je n’écoute que mon cœur…'
?>
Voyez-vous la différence? Cela est valable avec l'encodage de caractères par défaut (iso-8859-1). Il est possible qu'il n'en soit pas de même avec d'autres encodages (iso-8859-15, utf-8, etc.).