Notes d'archivage : s'il est bon de savoir comment peuvent être convertis les caractères accentués / diacritiques et spéciaux, il n'est pourtant ni recommandé, ni d'usage, d'écrire ces lettres sous forme d'entités... En effet, si l'encodage du texte est cohérent entre le stockage (base de données, fichiers) et l'affichage / rendu à l'écran, il n'est pas nécessaire de faire cet effort de transformation.

De plus, cela augmente la longueur de la chaîne de texte, ce qui peut poser problème lors de la sauvegarde si le champs en base de données est limité en nombre d'octets pris en compte. Gardons en tête le principe KISS, « Keep It Simple, Stupid », donc manipulons le contenu tel qu'il est.

L'encodage de texte UTF8mb4 permet aujourd'hui de stocker et afficher du texte de tous les alphabets et des émojis de toutes sortes...

Convertion chaînes de caractères / entités HTML

Si il est facile de convertir une chaîne de caractères contenant des accents et/ou des caractères spéciaux en son équivalent avec des entités HTML, l'inverse n'est pas toujours très aisé... Voici donc quelques infos et fonctions utiles.


Convertir de texte à entités

La fonction htmlentities() va convertir tous les caractères éligibles en leur équivalent en entités HTML au format &*****;. On entends par caractères éligibles tous les caractères qui disposent effectivement d'un équivalent...

chaîne [@]htmlentities( chaîne "chaîne à convertir" [, entier quote_style [, chaîne "charset"]] )
  • Le premier paramètre est donc la chaîne de caractères à convertir.
  • Le second paramètre, facultatif, correspond à une constante système qui lui indique comment traiter les apostrophes et les guillemets ; il accepte les valeurs ENT_COMPAT (convertir les guillemets mais pas les apostrophes - valeur par défaut...), ENT_QUOTES (convertir les guillemets et les apostrophes) et enfin ENT_NOQUOTES (ne convertir ni les guillemets, ni les apostrophes).
  • Le troisième paramètre, facultatif et apparu avec PHP 4.1.0, permet de spécifier le jeu de caractères ; par défaut, la valeur correspond à ISO-8859-1, soit l'alphabet Latin-1.

La fonction retournera la chaîne du paramètre 1 convertie...

Exemple :

<html> <head><title>Fonction htmlentities()</title></head> <body> <?php $str = "Un texte avec un mot accentué, entre ' apostrophe ', en \"<strong> gras </strong>\""; echo "0) " . $str . "<br />\n"; echo "1) " . htmlentities( $str ) . "<br />\n"; echo "2) " . htmlentities( $str, ENT_QUOTES ) . "<br />"; ?> </body> </html>

Résultat dans le code source :

<html> <head><title>Fonction htmlentities()</title></head> <body> 0) Un texte avec un mot accentué, entre ' apostrophe ', en "<strong> gras </strong>"<br /> 1) Un texte avec un mot accentu&eacute;, entre ' apostrophe ', en &quot;&lt;strong&gt; gras &lt;/strong&gt;&quot;<br /> 2) Un texte avec un mot accentu&eacute;, entre &#039; apostrophe &#039;, en &quot;&lt;strong&gt; gras &lt;/strong&gt;&quot;<br /> </body> </html>

Mais à l'affichage dans votre navigateur, vous avez ceci :

0) Un texte avec un mot accentué, entre ' apostrophe ', en " gras " 1) Un texte avec un mot accentué, entre ' apostrophe ', en "<strong> gras </strong>" 2) Un texte avec un mot accentué, entre ' apostrophe ', en "<strong> gras </strong>"

La première instruction echo renvoie le contenu de la variable tel quel, les balises sont donc interprêtées et le texte mis en gras, les apostrophes et guillemets sont elles aussi affichées. Dans le second echo, les guillemets et les chevrons des balises sont convertis, donc, il n'y a "plus" de HTML, on voit le code source, mais le navigateur interprête, lui, les entités et affiche les guillemets sous leur forme littérale. Enfin, dans le troisième echo, même les apostrophes sont converties en entités, mais là encore, le navigateur lit l'entité et l'affiche sous la forme littérale.


Convertir certains caractères en entités

Dans le cadre d'un forum, d'un tchat ou d'affichage de commentaires & messages sur votre site, il est préférable d'empêcher les gens de mettre des balises HTML, ceci afin que votre interface ne soit pas défigurée par une image gigantesque ou que des petits malins ne mettent des liens (ou pire) sur votre site... Vous pouvez utiliser à cet effet la fonction htmlspecialchars(), qui ne convertira que quelques caractères dans leur entités HTML équivalentes.

chaîne [@]htmlspecialchars( chaîne "chaîne à convertir" [, entier quote_style [, chaîne "charset"]] )
  • Le premier paramètre est donc la chaîne de caractères à convertir.
  • Le second paramètre, facultatif, correspond à une constante système qui lui indique comment traiter les apostrophes et les guillemets ; il accepte les valeurs ENT_COMPAT (convertir les guillemets mais pas les apostrophes - valeur par défaut...), ENT_QUOTES (convertir les guillemets et les apostrophes) et enfin ENT_NOQUOTES (ne convertir ni les guillemets, ni les apostrophes).
  • Le troisième paramètre, facultatif et apparu avec PHP 4.1.0, permet de spécifier le jeu de caractères ; par défaut, la valeur correspond à ISO-8859-1, soit l'alphabet Latin-1.

La fonction retournera la chaîne du paramètre 1 convertie...

Ainsi, les éperluettes (ou 'et commercial', càd le « & »), les < et >, les guillemets (sauf mention contraire avec le second paramètre) et eventuellement les apostrophes (avec le second paramètre) seront convertis.
Ce qui est largement suffisant pour empêcher l'interprêtation de tout code comportant des balises...


Si vous souhaitez enlever le code source HTML, c'est-à-dire les balises, utilisez strip_tags().
Voir >> fonction PHP strip_tags() / documentation officielle.


Convertir d'entités à texte

On a vu ci-dessus que l'on pouvait transformer facilement des caractères en leurs équivalents entité avec htmlentities(), mais est-ce que l'inverse est possible ? La réponse est oui, mais dépendante de votre version de PHP.

À partir de la version 4.3.0, vous pouvez utiliser html-entity-decode() (vous remarquerez encore une fois la magnifique cohérence de PHP dans le nommage des fonctions...), dont la documentation est >> ici.

Pour les versions antérieures de PHP, vous pourrez définir votre propre fonction maison :

function unhtmlentities( $string ) { $trans_tbl = get_html_translation_table( HTML_ENTITIES ); $trans_tbl = array_flip( $trans_tbl ); return strtr( $string, $trans_tbl ); }