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 !
|