Convertir un site en UTF-8

Qu'est-ce que l'UTF-8?

L'UTF-8 est un jeu de caractère "universel", il permet d'encoder tous les caractères existants, des accents français jusqu'aux symboles japonais.

Pourquoi convertir son site en UTF-8

Justement parce qu'il peut encoder tous les caractères existants. De plus, le PHP, dans sa prochaine version (la 6) travaillera exclusivement avec de l'UTF-8. De même, MySQL encode aussi ses données en UTF-8 et certains scripts (comme CrawlTrack) nécessitent que le site soit en UTF-8 pour fonctionner de manière optimale.
Sur cette page, vous apprendrez donc à convertir tout votre site de l'ISO-8859-1 en UTF-8.

ISO-8859-1????? C'est un colorant industriel?

Non, l'ISO-8859-1 est le jeu de caractère par défaut utilisé par Windows et par la majorité des gens qui créent un site en français. Ce jeu de caractères contient tous les accents propres au français. Si par hasard votre site est dans un autre jeu de caractères que l'ISO-8859-1, ce script fonctionnera tout de même.

Le script


Ce script n'est pas à proprement parler un script mais plutôt une simple fonction qui va parcourir l'entièreté des dossiers du site et convertir tous les fichiers en UTF-8.

En premier, on déclare la fonction:

function convert_utf8($repertoire){

La fonction n'aura qu'un argument, le répertoire à indexer. Si vous souhaitez indexer le répertoire courant ainsi que tous les fichiers et dossiers qu'il contient, il suffira, comme arguement d'entrer un point. La déclaration de fonction sera alors la suivante:

convert_utf8(.);

A présent, il va falloir ouvrir le répertoire passé en argument et le parcourir.
Pour ouvrir un répertoire, nous allons utiliser la fonction "opendir(répertoire)" qui nécessitera celle-ci "closedir(répertoire)" pour fermer le répertoire ouvert.
Nous allons donc convertir tous les fichiers TANT QU'il en a. Il va donc falloir utiliser une boucle. Comme condition, nous utiliserons "false !== $fichier = readdir($dossier)".
readdir(dossier) est une fonction qui va lister tous les fichiers contenu dans un répertoire. La condition est donc "Tant que "$fichier" ne vaut pas FALSE et donc, qu'on est pas encore arrivé au bout des fichiers du répertoire, on peut continuer à convertir.
Voici donc comment se profile le script pour l'instant:

$dossier = opendir($repertoire);
//Ouverture du dossier.

while(false !== $fichier = readdir($dossier)){
//Listage des fichiers.

A présent, il faut vérifier si le "fichier" que nous avons listé avec la fonction "readdir" est ou non un dossier. Pour ce faire, il va falloir d'abord "regrouper" les morceaux de chemins en un seul.
Par exemple, pour l'instant nous avons d'un côté "." (répertoir où se trouve le script) et "nom_d_un_dossier" (si votre dossier s'appelle comme ça). Il va falloir donc les regrouper en "./nom_d_un_dossier", puis vérifier si le chemin obtenu mêne ou non à un dossier.

Et si c'est un répertoire (ou dossier), qu'est-ce qu'on fait?

On le refait passer dans la fonction!!! La fonction s'appellera elle-même, c'est ce qu'on appelle une fonction réincursive.
Pour vérifier si c'est un dossier, nous allons utiliser la fonction "is_dir($chemin)" qui renvoie "true" si c'est vrai et sinon "false".

Voici comment se profile notre script pour l'instant:

function convert_utf8($repertoire){
$dossier = opendir($repertoire);
//Ouverture du dossier
       
while(false !== $fichier = readdir($dossier)){
//listage des fichiers

$chemin_du_fichier = $repertoire.'/'.$fichier;
//On crée le chemin complet vers le fichier

if(is_dir($chemin_du_fichier) && $fichier !="." && $fichier != ".."){
convert_utf8($chemin_du_fichier);
}

Dans la condition qui vérifie si c'est ou non un dossier, j'ai rajouté deux conditions: que le nom du répertoire ne soit pas "." (le répertoire courant) ou "..", (le répertoire contenant).

Maintenant, il reste encore à vérifier que l'extention du fichier est la bonne.

On ne peut pas convertir tous les fichiers?

Rien ne sert de convertir des images et ça peut les faire "bugger". Nous allons donc vérifier si l'extention du fichier est reprise dans un liste est si et seulement si c'est le cas, nous allons le convertir.
Pour vérifier l'extention, nous allons utiliser la fonction "eregi", que je trouve plus appropriée que "preg_match" dans ce cas et la chaine de caractère que nous allons lui envoyer est.... le nom du fichier!

C'est parti.

else{
/*On est obligé de mettre un "else" pour ne pas que les dossiers rentrent dans cette partie du script*/
if(eregi('.php', $fichier) || eregi('.htm', $fichier) || eregi('.html', $fichier) ||
eregi('.css', $fichier) || eregi('.js', $fichier)){
//Si l'extention se trouve dans cette liste, c'est OK.

Si l'extention est valide, nous allons récupérer tout le contenu du fichier dans une variable, convertir ce contenu en UTF-8, puis réécrire tout le contenu dans le fichier.
Pour récupérer TOUT le contenu d'un fichier dans une variable, nous allons utiliser la fonction "file_get_contents(fichier)". Ensuite, pour convertir le contenu en UTF-8, il suffit d'utiliser la fonction....utf8_encode(contenu). Pour écrire le contenu dans le fichier, nous utiliserons "file_put_contents(fichier, contenu);

Voici donc la fin du script:

$page = file_get_contents($chemin_du_fichier);
//Récupération du contenu

$page = utf8_encode($page);
//On converti le contenu de la page en UTF-8

if(!utf8_encode($page)){
//Si l'encodage a échoué, on prévient l'utilisateur:
echo 'La conversion du fichier '.$chemin_du_fichier.' a échoué!';
}

file_put_contents($chemin_du_fichier, $page);
//Ecriture du contenu du fichier.

}//Fin du "if" qui vérifie l'extention
}//Fin du "else" de la vérification de dossier
}//Fin de la bouce "while
}//Fin de la fonction

Voilà, le script est terminé, mais n'oubliez pas de rajouter un appel à la fonction à la fin du fichier:

convert_utf8(".");

Il suffit de vous rendre sur la page qui contient ce script et tout votre site sera converti en UTF-8.

Informations pour la conversion


Lorsqu'on tente de convertir son site en UTF-8, on rencontre un tas de petits problèmes mais, heureusement, très facile à résoudre.
Voici quelques petits trucs pour vous aider: -Convertissez votre site en LOCAL (avec WAMP si vous êtes sous Window ou XAMPP si vous utilisez Linux) de cette manière, vous pourrez régler les bugs sans que vos visiteurs en soient incommodés (vous pouvez aussi mettre votre site en mode maintenance, mais ce n'est pas recommandé).
Tous les caractères accentués de mes news (ou de toute autre info récupérée dans la BDD) est remplacée par un drôle de symbole. Que faire?
Juste après la connection à la BDD, rajoutez cette ligne:

mysql_query("SET NAMES UTF8");

Normalement, le problème est réglé.

-J'ai des caractères A© ou @ qui apparaissent sur mon site.
Ces caractères signifient que votre site est en UTF-8 mais qu'il est interprèté comme de l'ISO-8859-1 par votre navigateur. Pour corriger ce problème, il suffit que vous remplaciez cette ligne:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

par celle-ci:

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


Si, au contraire, vous avez des lonsanges noirs avec un "?" dedans, c'est que votre site est encodé en ISO-8859-1 et interprèté en UTF-8. Encodez votre site à l'aide du script ci-dessus.

Creative Commons License
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons
Page générée en 0.3949 secondes.
Retour en haut de la page
Imprimer cette page

Valid XHTML 1.0 Transitional