Il vous arrive peut-être de devoir mettre à jour un vieux projet web écrit en ANSI ISO-8859-1 et vous voulez probablement le convertir en UTF-8, le format d'encodage le plus abouti aujourd'hui, vous êtes alors dans le même cas de figure que moi; je vais donc vous expliquer comment convertir votre site en UTF-8 :D ...

Il y a à-peu-prêt 8-10 ans, le format d'encodage par défaut en Europe était l'ISO-8859-1. Aujourd'hui, c'est un peu moins vrai, voire plus du tout pour laisser place à l'UTF-8 comme format d'encodage utilisé. Cet encodage a l'avantage de gérer la plupart des langages donc facilement adaptable pour les sites multilingues...

L'encodage, c'est quoi?

L'encodage est un code numérique en langage machine désignant une représentation graphique. Pour une même représentation graphique, il peut y avoir plusieurs codes numériques, correspondant à un format d'encodage.

Par exemple, pour la représentation graphique du caractére "é":

  • En UTF-8, on aurait le code hexadécimal "C3A9"
  • En ISO-8859-1, on aurait le code hexadécimal "E9"

A noter, ISO-8859-1 est un encodage dit local alors que UTF-8 est un langage dit international.

Lors du Développement Web, il y a plusieurs niveaux d'encodages:

  • L'encodage propre au fichier (.php, .html, .css...).
  • La déclaration du charset pour l'interprétation des caractéres.

Le navigateur web (Firefox, Chrome, etc...) se servira du charset pour interpréter et donc décoder les caractères reçus depuis le serveur web.

A noter que si il y a une incohérence d'encodage et de charset, les caractères interprétés seront mal décodés.

On parle plus communément de Jeu de Caractères appliqué à un fichier pour décrire l'encodage.

Convertir l'encodage de mes fichiers web par lots

Maintenant que vous savez ce que représente l'encodage et le charset, on peut procéder à la conversion de votre site ! :)

Pour un projet web en ISO-8859-1, le charset et l'encodage seront définis en tant que tels. Il faudra donc convertir l'encodage de chaque fichier puis redéfinir le charset.

Pour cela, nous allons traiter les fichiers par lots - Imaginez l'horreur de les traiter un par un XC !

Nous allons utiliser un script Python éxecuté par Notepad++. Pour cela:

  1. Ouvrez Notepad++
  2. Dans Compléments > Plugin Manager, installez Python Script
  3. Redémarrez Notepad++
  4. Dans Compléments > Python Script, cliquez sur New Script
  5. Enregistrez le fichier ANSI_to_UTF8.py dans le dossier C:\Users_UserName_\AppData\Roaming\Notepad++\plugins\config\PythonScript\scripts
  6. Ajoutez le contenu ci-dessous puis enregistrez le fichier
  7. Redémarrez Notepad++
  8. Dans Compléments > Python Script, cliquez sur Scripts > ANSI_to_UTF8
  9. Patientez jusqu'a la fin du traitement

Le contenu du script est la suivante:

import os;
srcFilePath="E:\\Repository\\Project" 
for root, dirs, files in os.walk(srcFilePath):
    for fn in files: 
        if fn[-4:] == '.php' or fn[-3:] == '.js' or fn[-4:] == '.htm' or fn[-5:] == '.html' or fn[-4:] == '.css' or fn[-4:] == '.txt' or fn[-4:] == '.xml':
            console.write('-> Processing ' + root + "\\" + fn)
            notepad.open(root + "\\" + fn)
            encoding=str(notepad.getEncoding())
            if encoding != 'COOKIE':
                # COOKIE : UTF without BOM 
                # ENC8BIT : ANSI
                console.write('  -> Convertion UTF-8 from ' + encoding)
                if notepad.runMenuCommand("Encodage", "Convertir en UTF-8 (sans BOM)")== True:
                    notepad.save()
                    console.write("  -> OK\n")
                else:
                    console.write("  -> KO !!\n")
            else:
                console.write("  -> OK\n")
            notepad.close()

Dans ce script, il faudra modifier srcFilePath pour le faire correspondre à votre projet. Il faudra aussi adapter les commandes Notepad++ à la langue utilisée par votre version.

Vous pouvez voir les fichiers traités dans la console du plugin !

Modifier le charset de mes fichiers html

Cette partie est la plus pénible ! XC
Car là, il faudra modifier intelligemment la définition des charsets de vos entêtes de pages web...

Je vous conseille de prendre Notepad++, puis de rechercher ISO-8859-1 (ou autre variante) dans les fichiers html, php et xml de votre projet. (Ctrl + Shift + F)

Vous avez plusieurs possibilités:

  • Pour les fichiers intégrés à un framework (Ex. ckeditor), ne pas toucher ! (Bon peut être avec un peu plus d'analyse, il serait plus judicieux de faire le changement mais c'est à vous de la faire ;) )
  • Pour les fichiers qui sont liés à votre développement, il faut faire la modication !
  • Pour les autres fichiers, il faut faire une analyse !

A noter que si il n'y a pas de modication du charset pour un fichier, il faut revenir à l'encodage d'origine (Soit par Notepad++, soit par votre outil de gestion de configuration -> Revert )

Là où il y a changement du charset, il y a ligne suivante:

PHP:       header('Content-Type: text/html;charset=iso-8859-1');
XML:       <?xml version="1.0" encoding="iso-8859-1"?>
HTML 4:    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
HTML 5:    <meta charset="iso-8859-1">
XHTML 1.1: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Que vous devez transformer en:

PHP:       header('Content-Type: text/html;charset=UTF-8');
XML:       <?xml version="1.0" encoding="UTF-8"?>
HTML 4:    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
HTML 5:    <meta charset="UTF-8">
XHTML 1.1: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Faites attention à la fonction htmlentities si utilisé dans votre projet, il faut peut être modifier l'argument encoding !

Convertir ma base de donnée MySQL

Si votre projet web utilise une base de données, et que vous souhaitez aussi convertir vos entités ISO-8859-1 en UTF-8, c'est possible mais pas indispendable ! Cependant, pour une question de portabilité et de cohérence, je conseillerais de faire la convertion...

Entre MySQL et PHP, si PHP sait que les entités sont encodés en ISO-8859-1, il fera automatiquement la convertion vers UTF-8 lors de la récupération !

Pour cela, la commande est simple... Il suffit d'executer l'instruction suivante sur chaque table:

ALTER TABLE {tablename} CONVERT TO CHARACTER SET utf8;

J'ai � qui s'affiche, cela veut dire quoi ?

Vous avez un probléme d'encodage ! xD
Allez, cela signifie que la source est de l'ANSI (ISO-8859-x) et que vous essayer d'interpréter les caractère en tant que UTF-8, entre autre pour les caractères accentués...

Il se peut aussi que le charset renvoyé à PHP soit défini en tant que ISO-8859-x bien que vos tables soient en UTF-8. Pour pallier à ce problème, ajoutez la ligne suivante aprés la connexion à votre base de données (ou l'instanciation de Mysqli):

$mysqli->query("SET NAMES 'utf8';");

J'ai les caractères du style "Ã�©" qui s'affichent, cela veut dire quoi ?

Toujours un problème d'encodage ! xD
Cette fois ci, vous tentez d'afficher de l'UTF-8 avec un jeu de caractères ANSI (ISO-8859-X)

Cela veut dire que vous avez un problème de charset quelque part ! Revérifiez vos fichiers ;)

Article précédent Article suivant


Ajouter un commentaire