Avoir un site/serveur php mysql en full UTF-8

20 October 2008 par Patrice De Saint Steban

L'encodage est quelque chose de toujours problématique surtout avec des applications internationales. De plus en plus on doit ajouter de nombreuses langues et surtout les langues exotiques comme le chinois, le japonais et l'arabe.

image

Pour vraiment réussir l'utilisation d'un site en UTF-8, il faut vraiment faire attention à ce que toute la chaîne soit bien en UTF-8. Cela peut très rapidement être source de nombreux problèmes incompréhensibles. C'est pourquoi, commencer dès le départ par tous migrer en UTF-8, est la meilleure façon pour réussir.

Il faut vraiment faire attention à que toute la chaîne de production soit vraiment adapté à l'UTF-8. Tout d’abord, il faut que toutes les données soient en UTF-8, cela comprend la base de donnée, mais aussi les fichiers sources du site. Ensuite, il faut indiquer au navigateur que le site est en UTF-8. Pour cela, le navigateur utilise trois facteurs pour déterminer l’encodage. La principale est l’encodage que l’utilisateur choisit dans son navigateur. Il est préférable d’utiliser l’option automatique. Ensuite le navigateur regarde dans les entêtes HTTP, l’option Content-type qui lui indique le format (text/html) et surtout l’encodage à utiliser. Si le navigateur ne trouve pas d’encodage, il va alors regarder dans les informations “méta” de la page html.

image

Apache :

Apache lorsque qu’il va envoyer une page d’un site internet, quel soit en html ou en php, il va envoyer l’entête HTTP indiquant au navigateur l’encodage à utiliser. Il est donc impératif de préciser à Apache d’envoyer l’entête indiquant que le site est en UTF-8.

Pour cela, il y a plusieurs solutions, soit on modifie directement le fichier de configuration d’Apache(/etc/apache2/httpd.conf sous linux ou apache2/conf/httpd.conf sous windows), cela s’appliquera à tous les sites héberger sur le serveur, soit on utilise un fichier .htaccess qui permet d’appliquer des configurations apache à un répertoire en particulier.

Dans tous les cas, ajouter la ligne (en remplaçant la ligne éventuellement présente) dans le fichier de la méthode que vous avez choisis :

AddDefaultCharset	UTF-8

Il peut arriver qu’on ne puisse accéder aux configurations du serveur apache, et que l’utilisation du fichier .htaccess soit interdite sur le serveur (notamment sur les serveur mutualisé), on peut toujours configurer cette entête en utilisant une commande PHP :

header('Content-type: text/html; charset=UTF-8');

Il faut donc ajouter cette ligne PHP au début de chaque page PHP de votre site internet (attention il ne faut pas avoir d’affichage avant cette commande : pas de code html, ni de echo)

MySQL :

Ensuite, il est important que la base de données soit aussi en UTF-8, il faut utiliser pour cela la commande CHARACTER SET pour indiquer l’encodage de caractère à utiliser, la commande COLLATE permet d’indiquer à MySQL comment gérer les chaînes de caractères avec les fonctions de chaines de caractère (un accent utilise 2 octets).

On utilise ces commandes lors d’une création d’une base de données ainsi que lors de la création d’une table et de colonne acceptant des chaines de caractère.

Voici un exemple d’un script SQL utilisant ces commandes :

CREATE DATABASE toto_utf8CHARACTER SET utf8COLLATE utf8_bin;
CREATE TABLE test_utf8 (titre VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,texte VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL) CHARACTER SET utf8;

Lors d’une connexion à une base de données, il est nécessaire d’indiquer à MySQL dans quel encodage les données doivent être renvoyé au script PHP. Pour cela, une fois la connexion établie, il est nécessaire d’envoyer la commande suivante :

SET NAMES 'utf8';

Voici un exemple d’utilisation en PHP :

<?php
$db = mysql_connect('localhost', 'root', '');
mysql_select_db('toto_utf8', $db);
mysql_query("SET NAMES 'utf8';", $db);
$result = mysql_query("SELECT * FROM test_utf8;", $db);
?>

PHP :

PHP ne gère pas par défaut les chaînes de caractères au format UTF-8, une bibliothèque a donc été écrite permettant d’utiliser les fonctions de traitement des chaines de caractère avec des chaînes au format UTF-8. Par exemple, la fonction strlen qui retourne la longueur d’une chaîne de caractère retournera 2 pour un caractère accentué alors qu’il n’y a théoriquement qu’un seul caractère.

Pour activer cette bibliothèque, il faut modifier le fichier de configuration de PHP (php.ini dans le répertoire des binaires d’Apache) et dé-commenter la ligne permettant de charger le module mbstring. Il faut ensuite ajouter ces quelques lignes pour configurer le module.

	; Langage par défaut
	mbstring.language=UTF-8
	; Jeu de caractère interne
	mbstring.internal_encoding= UTF-8
	; Jeu de caractères par défaut pour les données d'entrée HTTP
	mbstring.http_input=UTF-8
	; Jeu de caractères par défaut pour les données de sortie HTTP
	mbstring.http_output=UTF-8
	; Ordre de détection des jeux de caractères
	mbstring.detect_order= auto

Une option de configuration permet même de remplacer les fonctions natives de gestion de caractère en php par des fonctions modifiées de la bibliothèque mbstring. Cette option est à manipuler avec précaution, car il se peut que de nombreux scripts ne soit pas compatible avec cette option (PhpMyAdmin, Phpbb, Joomla…)

Html

Comme je l’ai indiqué, l’information sur l’encodage présente dans le code html n’est utilisé par le navigateur seulement lorsque qu’il ne trouve pas l’information dans les entêtes HTTP. Néanmoins, il est quand même nécessaire d’indiquer cette information. Cela ce fait grâce à la balise “meta” à insérer entre les balises <head> et </head>; de votre code html :

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

Fichier

Finalement, il faut faire attention à ce que les fichiers en eux-même soit vraiment en UTF-8 ;-) sinon on a fait tous le travail pour rien. Il faut bien penser à configurer vos éditeurs pour utiliser l'encodage UTF-8.

Eclipse

On peut configurer Eclipse pour qu'il enregistre tous les fichiers en UTF-8, pour cela, rien de plus simple, il suffit de modifier les propriétés du projet, dans l’onglet Resource, il faut modifier l’option “Text file encoding” en cliquant sur “other” et sélectionnant UTF-8 dans la liste des types d’encodage.

image

Emacs

Pour configurer Emacs, il faut modifier le fichier de configuration (~/.emacs) en ajoutant les commandes suivantes :

;;
;; utf-8
;;
(setq locale-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

Convertir des fichiers

Pour convertir des fichiers encodés dans un autre format, vous pouvez utiliser pour cela votre éditeur de texte, et sélectionner le nouvelle encodage lors de l’enregistrement.

Il est aussi possible d’utiliser une ligne de commande pour convertir un fichier d’un encodage à un autre :

iconv -t UTF-8 -f ISO8859-1 texte1.txt > texte2.txt

l’option –t permet de définir l’encodage de destination, alors que l’option -8 permet de définir l’encodage du fichier source. On indique ensuite le fichier à lire et enfin on enregistre le tout dans un nouveau fichier grâce à la redirection de la sortie de la commande dans un fichier.

Reconnaitre rapidement les problèmes

Lorsque que l'on essaye d'utiliser les différents encodages, il arrive souvent d’avoir des erreurs voici une petite aide pour reconnaitre les erreurs qui peuvent arriver :

  • Si vous voyez sur la page les caractères suivant : "é", "î", "Ã", ... c'est que la page est bien en UTF8, mais que le navigateur essaye de les afficher en ISO
  • Si au contraire vous voyez le caractère "image ", c'est que la page est en ISO et que le navigateur essaye de les afficher en UTF-8

image

Voilà, alors maintenant avant de vous arracher les cheveux à cause d’un problème d’encodage, vérifier bien que toutes les données soit bien en UTF-8.

Tags: , ,

Un commentaire pour “Avoir un site/serveur php mysql en full UTF-8”

  1. Jeff dit :

    Pas mal du tout.

Laisser un commentaire


"));