>> Accueil > Le coin informa... > Développement > Généralités sur... > Convertir votre application PHP/ Mysql vers UTF-8

Convertir votre application PHP/ Mysql vers UTF-8

TUTORIAL : Convertir un site en UTF-8




Nous partons du principe que notre application est développée sur un environnement PHP/Mysql/Apache.


1- Les fichiers hébergés

J'appelle les fichiers hébergés tout le contenu du dossier "www" ou "htdocs" du serveur apache. C'est à dire les fichiers .php, html, js ou autre. Pour être compatible UTF-8 il faudra donc coder les fichiers en UTF-8. Avec Notepad ++, rien de plus simple :


Pour convertir des fichiers, éditer les fichiers hébergés puis allez dans le menu Encodage puis cliquez sur Convertir en UTF-8 (sans BOM) :

5g29ku7kj.jpg


Ne négligez pas le paramètre "sans BOM". Le paramètre BOM sert à définir une marque d'ordre des octets en début de fichier. En php, vous pouvez rencontrer des problèmes d'en-têtes (Header) si vous utilisez les sessions par exemple.


Pour créer de nouveaux fichiers en UTF-8, Cliquez sur le menu Encodage puis Encoder en UTF-8 (sans BOM).

7ypm1fuct.jpg

2- Définir l'encodage pour Apache :

Créez un fichier .htaccess à la racine de votre site :

Code :

#contenu .htaccess
#This should override any charset specified in the body of the response via a META element
AddDefaultCharset UTF-8


3 - Définir l'encodage dans la partie <HEAD> de votre code HTML :

Ce paramètre est facultatif si le paramètre "AddDefaultCharset" est accepté par votre hébergeur.


Code Html :
	
	
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT='"text/html; charset=UTF-8">
....
Mon code HTML
</head>


Je conseille tout de même de le renseigner pour des questions de portabilité.


4 - Définir l'entête HTTP

Code PHP :
Ne pas oublier les balises <?php ... ?>

<?php
....
header("Content-Type: text/html; charset=UTF-8");
....
....
....
?>

5 - Définir l'encodage interne pour PHP

Insérez ce code en haut de votre script PHP avant même de démarrer votre appel à session_start() (si vous utilisez les sessions) :
Code PHP :
Ne pas oublier les balises <?php ... ?>

<?php
//Defini l'encodage interne
mb_internal_encoding("UTF-8");
....
....
....
?>


Ensuite, lorsque vous traiterez des chaines de texte, utiliser les fonctions avec le préfixe mb. Ex : mb_strlen, mb_strtolower, mb_strtoupper ...
Ne négligez pas ces fonctions, car en définissant l'encodage interne en UTF-8, chaque caractère sera codé sur 4 octets au lieu d'un. La fonction strlen par exemple pourraient retourner une longueur de chaine incorrecte si elle analyse une chaine composée de caractères sur 4 octets alors qu'elle en attend seulement 1.





6 - Définir le jeu de caractères pour MySql

Vous pouvez modifier le jeu de caractères MySql en ajoutant une requête après la connexion au serveur : "SET NAMES UTF8" :


Code PHP :
Ne pas oublier les balises <?php ... ?>

<?php
    $dbh 
mysql_connect$host$username$password );
    
    
if ( !$dbh ){
       $err=mysql_error(  );
       die( "Database error: $err" );
    }
    else {
        mysql_select_db$db$dbh ) or die ( "Database not available!" );
        mysql_query("SET NAMES UTF8");
    }
?>


Cette requête indique à MySql que le client enverra ses données en UTF-8. Une autre commande peut définir la collation. Elle servira à dire à MySql comment comparer les données stockées (tri des caractères accentués par exemple). 
Code PHP :
Ne pas oublier les balises <?php ... ?>

<?php
 mysql_query
("SET CHARACTER SET UTF8");
?>



La collation utilisée par défaut dans MySql est latin1_swedish_ci. Pour les caractères européens aucun souci de compatibilité. En revanche si vous voulez utiliser des caractères dans d'autres langues, modifiez la configuration de votre base de de données, de vos tables et de vos champs textes avec un interclassement UTF-8 :

Code Sql :
	
	
-- Requête pour modifier l'interclassement de la base de données
ALTER DATABASE `nom_de_ma_bdd` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

-- Requête pour modifier l'interclassement d'une table
ALTER TABLE `nom_de_ma_table` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

-- Requête pour modifier l'interclassement d'un champ texte
ALTER TABLE  `nom_de_ma_table` CHANGE `mon_champ` `mon_champ`  VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci  NOT NULL;


Les requêtes affichées ci-dessus sont optionnelles sachant que nous avons déjà défini la collation et le jeu de la caractères grâce aux commandes SET NAME et SET CHARACTER SET.
Je ne connais pas de commande permettant de modifier d'une pierre de coup l'ensemble de la structure de la base de données en UTF-8




Conclusion


Après ces modifications vos efforts seront récompensés et vous serez enfin en UTF-8. Pour le vérifier, affichez votre site web dans votre navigateur puis aller dans le menu "Page" puis "Codage" pour Internet Explorer 8 et dans le menu "Affichage" puis "Encodage des caractères" pour firefox. Vous devriez voir Unicode (UTF-8) coché.














<< Généralités sur UTF-8Zone PHP >>

Haut de page

Poster un commentaire


1 commentaire

Mathieu
(Non membre)

Le 17 avril 2011 à 10h02


> Pas mal du tout ! Merci pour ce tuto très complet. J'ai vu que l'appel à mb_internal_encoding pouvait être évité en modifiant directement le fichier php.ini :
http://web-o-blog.blogspot.com/2011/04/utf-8-with-phpmysql.html


S'abonner - Se désabonner
   

Ajouter un commentaire :

Les liens sont automatiquement formatés.
Si vous avez une question, essayez de communiquer un maximum d'informations !
N'hésitez pas à partager vos avis ou remarques :)

Pseudo :
 
 

 

Recopiez le code ci-contre :







Haut de page
Lecoindunet.com
Accueil - Mentions Légales - Contact - S'inscrire - Plan du site -