L’encodage des caractères

Pour que les accents d'une page Web soient correctement affichés, il faudra utiliser un encodage approprié pour chaque acteur qui entre en ligne de compte : le fichier .php, la base de données, la page HTML, etc.

Voici comment spécifier l'encodage de chacun de ces acteurs.

▼Publicité

Encodage manuel des caractères

La façon la plus sûre pour obtenir un affichage correct des accents ou caractères spéciaux consiste à les encoder à la main. Un caractère qui a été encodé manuellement sera affiché comme il faut peu importe le jeu de caractères utilisé par les différents acteurs impliqués dans l'affichage de la page Web.

L'encodage manuel est cependant une méthode longue qui devrait être réservée pour les cas d'exception.

Pour encoder manuellement un caractère, vous pouvez :

  • Entrer son code HTML (ex : é pour le é)

    ou

  • Entrer son numéro Unicode HTML (ex : é pour le é).

Notez qu'il existe des caractères qui ne font pas partie de la charte ASCII étendue mais qui peuvent être affichés sur une page Web. C'est le cas, par exemple, du signe de paragraphe (¶) qui peut être affiché à l'aide de son code HTML (¶) ou de son numéro Unicode HTML (¶).

Bien que nous tenterons toujours d'être consistent dans l'encodage des caractères, les fonctions PHP htmlentities(), utf8_encode() et utf8_decode() peuvent être utiles lorsqu’un fichier utilise un encodage différent du code HTML produit. Voir la documentation sur ces fonctions pour plus de détails.

Quel jeu de caractères utiliser

Si le site Web doit être multilingue, l’encodage à utiliser de préférence est l’UTF-8. Cet encodage permet de représenter dans une même table les caractères de différentes langues :

  • caractères français, autrement identifiés dans la table Latin-1 ou ISO-8859
  • caractères d’europe centrale, autrement identifiés par ISO 8859-2
  • caractères turcs, autrement identifiés par ISO 8859-9
  • etc.

Attention : les caractères de la table UTF-8 n’utilisent pas tous le même nombre d’octets. Vous devrez être prudents en utilisant les fonctions PHP suivantes :

  • strlen() va retourner le nombre d’octets et non le nombre de caractères.
  • substr() travaille également avec les octets et non avec les caractères.
  • Il faut leur préférer les fonctions mb_substr() et mb_strlen(). Il faut d’abord préciser l’encodage à l’aide de la fonction mb_internal_encoding("UTF-8"). Dans ces fonctions, les caractères mb signifient multi-byte.

Encodage du fichier .php

Le fichier texte dans lequel vous entrez votre code PHP utilise un jeu de catactères donné. L'encodage utilisé par défaut est souvent ANSI, ce qui peut causer des problèmes d'accents.

Pour vous assurer que votre fichier est encodé en UTF-8, recherchez dans votre éditeur de texte un menu Format ou Encodage (Encoding) et choisissez l'encodage en UTF-8. Attention : dans certains éditeurs, ce menu ne montre pas l'encodage actuellement utilisé par le fichier mais bien le dernier encodage à avoir été choisi dans le menu...

La plupart des éditeurs permettent également de configurer l'encodage à utiliser par défaut lors de la création d'un nouveau fichier. Prenez le temps de vérifier les possibilités offertes dans les options de configuration, ceci pourrait vous sauver bien des frustrations !

Encodage de la page HTML

Pour que le navigateur décode correctement la page HTML, vous devez indiquer l’encodage dans la balise meta charset :

HTML 5

<meta charset="UTF-8" />

Encodage lors de la lecture ou de l'écriture dans la base de données

Les données doivent être correctement encodées lorsqu'elles sont écrites dans la base de données MySQL. Elle doivent également être bien encodées lors de la lecture :

  • Si vous utilisez l’utilitaire graphique de phpMyAdmin pour entrer des données dans la table, utilisez l’interclassement utf8_unicode_ci.
  • Si vous utilisez un fichier SQL pour créer les tables, spécifiez DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci à la fin de la commande de création de la table. Notez que le charset identifie l’encodage utilisé alors que le collate identifie comment les données seront classées (ordre des accents quand on veut trier les données).
  • Avant la lecture ou l’écriture des données dans une table par programmation, il faut exécuter la commande mysql_set_charset(). Il est possible de le faire directement lors de la connexion à la base données.
    PHP

    @$mysqli = new mysqli("localhost", "usager", "motdepasse", "mabd");

    if ($mysqli->connect_errno) {

       die("Échec lors de la connexion à la base de données");

    }

    $mysqli->set_charset("utf8");

Attention : lors de la création d'une procédure stockée à la ligne de commande MySQL, exécutez la commande SET NAMES ‘UTF8’ avant le CREATE PROCEDURE. Ceci assure que les accents contenus dans la procédure stockée, s'il y a lieu, seront correctement encodés dans la base de données.

Pour plus d'information

« Caractères spéciaux et entités HTML ». http://alexandre.alapetite.fr. http://alexandre.alapetite.fr/doc-alex/alx_special.html

« Introduction aux jeux de caractères ». Open Web Group. http://openweb.eu.org/articles/jeux_caracteres

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories