Actualités

Linux Debian (Lenny) et Apache UTF-8 Round 1
clockEcrit par Poil | clock2008-02-21 19:24:24

Je me suis battu avec l'UTF-8 sur ma Debian Lenny aujourd'hui.
En effet j'ai décidé de coder mon nouveau site en UTF-8, je pensais que cela allait être simple; et bien non toujours pas!

Dans ce tutorial je vais aborder :

  • Apache2
  • MySQL
  • PHP
  • Debian
  • vim
  • la conversion des fichiers non-utf8
  • Vos pages web
  • Requêtes SQL avec PHP
  • Ce qu'il ne faut pas faire
  • Ajaxterm

Je n'ai pas la science infuse, je vous décris donc une procédure qui semble marcher pour moi; vos commentaires sont les bienvenues pour compléter ce tutorial.


Apache 2 :
Nous allons tout d'abord éditer le fichier /etc/apache2/conf.d/charset
Assurez vous que les lignes de type "AddDefaultCharset" soient bien commentées.
En effet, aujourd'hui la détection automatique de l'encodage semble bien fonctionner; et dans les rares cas ou cela ne fonctionne pas il existe des moyens de contournement.
Vous pouvez également vérifier que le fichier /etc/apache2/mods-enabled/mime.conf contient bien la ligne AddCharset UTF-8 .utf8

MySQL :
Pour MySQL rien de plus simple, lors de la création d'une base assurez-vosu que celle-ci est bien créée en UTF-8

Exemple :

CREATE DATABASE mybase_utf
CHARACTER SET utf8
COLLATE utf8_bin;
  • CHARACTER SET : spécifie l'encodage
  • COLLATE : spécifie l'attitude de mysql envers les données (collation)
  • utf8 : orthographe propre à mysql (absence du "-" entre utf et 8)
  • utf8_bin : cette collation rend la comparaison de chaîne sensible à la casse (au contraire de utf8_general_ci)

Chaque table d'une base peut avoir son propre jeu de caractère/collation, de même que chaque colonne.

Exemple de création de table:

CREATE TABLE tutu (
bin VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
gen_ci VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) CHARACTER SET utf8;

Si MySQL n'est pas configuré par défaut pour l'UTF-8 il faut lui préciser la manière dont elle doit traiter les caractères contenus dans une requête SQL à l'aide de cette instruction : SET NAMES 'utf8';

PHP :
Pour PHP, je n'ai pour le moment rien touché; ça a l'air de fonctionner. Je vais pousser mes tests un peu plus loin et voir si il faut activer mbstring / iconv.

Debian :
C'est bien beau de faire des pages en UTF-8, mais si notre éditeur n'est pas en UTF-8 comment fait-on ? Et puis vu que notre éditeur est en UTF-8 autant mettre notre système en UTF-8!
En root lancez la commande dpkg-reconfigure locales
Cochez fr_FR.UTF-8. Cochez également fr_FR.ISO-8859-1 et fr_FR@euro ISO-8859-15 pour des raisons de compatibilités.
Sur la page suivante configurez fr_FR.utf-8 en locale par défaut.

vim :
C'est ce petit éditeur qui m'a posé le plus de soucis, j'ai lu tout et n'importe quoi.
Il suffit simplement de mettre dans /etc/vim/vimrc:

set encoding=utf-8
set fileencoding=utf-8

La conversion de vos fichiers non UTF-8 :
Vous avez probablement des fichiers, des pages web non UTF-8.
Pour les convertir en UTF-8 installez recode aptitude install recode
Puis pour chaque fichier qui pose problème exécuter recode UTF-8 monfichier.php

Vos pages web :
Tout d'abord vos pages doivent posséder l'entête :

Si vous avez des soucis avec PHP vous pouvez forcer l'entête avec la ligne :

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

Requêtes SQL avec PHP :
Lorsque je faisais une requête SQL avec PHP j'obtenais des accents corrompu. Il faut en fait à chaque connexion spécifier :

mysql_query("SET NAMES 'utf8'");

Je n'ai pas cherché en mysqli, je vous laisse chercher.

Ce qu'il ne faut pas faire :
J'ai trouvé sur Internet des sites qui disaient de mettre dans vim l'option set bomb; ne le faites pas. Cette commande ajoute en début de fichier un marqueur d'ordre des octets qui est inutile en UTF-8 et qui pourra provoquer lors d'utilisation de cookie/session avec PHP des erreurs de type headers already sent

Ajaxterm :
Depuis la version 1.17 Ajaxterm supporte différents encodages.
J'ai installé la version 1.20 et simplement mis dans le fichier anyterm.html :

window.onload=function() {create_term("term","%h (Anyterm%v)",45,180,"","UTF-8");};

Enfin :
Ce guide s'enrichira au fur et à mesure des soucis que je rencontre. Bon courage à tous !

Commentaires

Aucun commentaire
Développé par Poil - Graphismes de DarkDaV - IcÃŽnes sous licence Creative Commons (famfam, nuovo ...)