constant stream of curated content
by seb - 2007-12-19 22:00
Les pages de ce site (et notamment les mémos) devraient pâtir assez longtemps de mon récent passage à l'UTF-8.
En effet, histoire de me mettre à l'abris de tout problème d'encodage éventuel, j'ai décidé de passer à cette norme plus internationale qui permet, quel luxe, de dire bonjour en arabe et en japonais:

السلام عليكم

を編集中


Seulement voilà, c'était beaucoup plus difficile à mettre en oeuvre que je ne l'avais imaginé, et je dois reprendre tous mes textes pour les convertir manuellement, je vous garantit qu'afficher correctement les 3 langues de ce texte est pour moi un véritable plaisir quand je vois le temps que j'ai passé à farfouiller sur les forums.

En gros, je résume (allez je m'essaye à un petit tutoriel):

Prenons les choses dans l'ordre:

En premier lieu, vous allez reprendre un à un tous vos fichiers sur le serveur, et vous les réencodez en UTF-8. Sous Mac, TextEdit le fait très bien avec un simple "Enregistrer sous", sous windows je suppose que le notepad doit faire pareil.
Vérifiez que votre conection FTP est en mode binaire, et pas ASCII (ça évitera bien des problèmes).

Ensuite nous allons nous intéresser à chaque brique logicielle.

• APACHE:
A priori vous n'avez pas accés à la config d'Apache, peu importe. Dans le fichier .htaccess (à la racine de votre site web, si il n'existe pas créez-le), vous ajoutez la ligne suivante (c'est la même si vous pouvez accéder au httpd.conf):
AddDefaultCharset UTF-8


• PHP:
Alors là, deux solutions, soit PHP est installé sur votre serveur avec la librairie mbstring, soit il ne l'est pas. Sincèrement je vous souhaite qu'elle soit incluse, sinon je vous invite à ramer sur les forums et prier pour que php6 sorte vite.

Si la librairie MBSTRING est installé, vous devrez tout de même remplacer certaines fonctions comme strlen() par mb_strlen() (mb=multi-byte) pour que le compte soit bon. Voyez ici quelles fonctions posent problème.

• MYSQL
J'ai lu dans vos pensées: vous vous êtes dit après PHP le plus dur est fait. Grave erreur.

Déjà, constatation préliminaire, phpMyAdmin ne vous sera d'aucun secours: il gère très (très très) mal l'UTF-8.

Essayons d'ordonner nos idées.

Si vous voulez faire mieux et plus rapidement que ce que j'ai fait (et surtout si votre base n'est pas un vaste foutoire avec deux encodages différents sur une même table ;-)

• Faites une sauvegarde (commande DUMP)
• Recréez une nouvelle base en UTF-8 ;
CREATE DATABASE base CHARACTER SET utf8 COLLATE utf8_bin

• Changez les charset et collate, pour les mettre en UTF-8.
• Convertir le fichier de sauvegarde en UTF-8 (démerdez-vous)
• L'importer.

Enfin, pour chaque page PHP, lorsque vous déclarez le lien MYSQL, vous devez ensuite faire la requête suivante:
SET NAMES utf8

chez moi ça donne ça (c'est une fonction de ma librairie qui crée le lien MYSQL a chaque instance de page):

$link = mysql_connect ($db_host,$db_user,$db_pass) or die ('Erreur : '.mysql_error());
mysql_select_db($db_db) or die ('Erreur :'.mysql_error());
mysql_query("SET NAMES, 'utf8'");
return $link;


• Concernant le code HTML.
Il faut en dernier lieu s'intéresser à ce qui arrive chez le client. A priori nous supposons que son navigateur accepte l'UTF-8.

Votre page HTML doit contenir la balise meta suivante:


Si vous travaillez en XML, se sera


Concernant les formulaires, surtout ne faite pas la même erreur que moi, ça vous évitera de perdre les précieuses heures qui vous séparent de votre mort et que vous devriez consacrer à chérir vos proches:
!! DANS LA BALISE N'OUBLIEZ SURTOUT PAS SOUS PEINE DE GACHER VOTRE DB DE PRECISER L'ENCODAGE !!
par exemple la présente page, quand j'édite la source, le form prend l'allure suivante:


et normalement tout ira bien.

Je me tiens à votre disposition pour toute question là dessus (j'ai bien mis les mains dans le cambouis, alors allez-y je suis chaud)