Accueil » Programmation

PHP : Encodage UTF-8, ISO-8859-1 et entitées HTML

12 mai 2009 Pas de commentaires

Il est courant de voir certains programmeurs même d’un bon niveau confondre encore le jeu de caractères utilisé (charset) avec les entités HTML.

Le jeu de caractères ou charset définit avec l’encodage de l’alphabet utilisé. En Europe on utilisait généralement ISO-8859-1 puis le signe € manquait à ce jeu de caractère donc il a été créé l’ISO-8859-15. Désormais il est préférable d’utiliser l’encodage UTF-8 qui a pour but de regrouper tous les caractères de tous les alphabets assurant ainsi une meilleur portabilité et uniformité de langage.

Les entités HTML elles n’ont rien à voir avec le charset utilisé. Ces entités servent à afficher d’une seule et même manière des caractères sans prendre en compte l’encodage utilisé. Ces entités ne sont utiles que lors d’un affichage par un navigateur contrairement à l’encodage des fichiers qui peut l’être aussi dans des documents text.

Pourquoi l’encodage entre ISO-8859-1 et UTF-8 est différent et fait ressortir des caractères spéciaux ?

Chaque caractère ISO est codé sur 1 octet soit 8 bits. La limite maximale de caractères possible est donc 2 puissance 8 soit 256 moins le 0 initial soit 255 caractères possibles. C’est trop peu pour pouvoir introduire les lettres acentuées ou les cédilles.

La norme UTF-8 code les caractères sur 1 à 4 octets. Par exemple le caracté é (e accent aigu) est codé sur 2 octets que nous retrouvons lorsque nous tentons d’afficher ce é encodé en UTF avec un navigateur attendant de l’ISO (on retrouve des é donc bien 2 caractères)

Schématisons donc ce qui se passe pour la lettre é encodée en ISO :

ISO-8859-1 é
UTF-8
entité HTML é

Schématisons donc ce qui se passe pour la lettre é encodée en UTF :

ISO-8859-1 é
UTF-8 é
entité HTML é

Comment encoder les entités HTML avec les fonctions PHP en protégeant le typage.

Les fonctions html_entities() et htmlspecialchars() et leur équivalent de décodage acceptent en 3e argument la spécification du charset utilisé. Voici dont 2 petites fonction vous permettant de résoudre une partie de vos problèmes d’encodage.

function htmlentities_utf8($string){
return htmlentities($string, ENT_QUOTES, 'UTF-8');
}

function unhtmlentities_utf8($string){
return html_entity_decode($string, ENT_QUOTES, 'UTF-8');
}

Laissez un commentaire

Ajoutez votre commentaire ci-dessous, ou créez un rétrolien depuis votre site. Vous pouvez également souscrire à ces commentaires par RSS.

Merci de vous conformer à la netetiquette.

Vous pouvez utiliser ces balises :
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>