Francescu e Dume

Encodage : convertir un site en UTF8 - PHP/MySQL



Encodage : convertir un site en UTF8 - PHP/MySQL
Alors qu'il y a quelques années l'UTF8 naissait , réconcilliant le monde entier, on aurait pu penser qu'il aurait immédiatement trouvé sa place. Si aujourd'hui créer un projet en UTF-8 est bien loin d'être systématique, il ne s'agit pas forcément d'un manque de volonté, mais plutôt d'une difficulté de mise en oeuvre, souvent déconcertante. Le problème d'encodage est récurrent, mais je vais essayer dans cet article de vous prouver que la mise en oeuvre de l'UTF-8 dans vos projets peut se faire très rapidement. Voici donc les grandes étapes pour migrer votre application web en UTF8, et pourquoi pas conquérir de lointains marchés !

Requêtes HTTP


Tout d'abord quand un visiteur arrive sur votre site, son navigateur doit savoir qu'il a affaire à de l'UTF8, alors voici la marche à suivre.
  • Par ordre de priorité pour le navigateur :
  • Fixer le parametre charset dans les requêtes HTTP (cf W3C)
    • dans apache remplacez AddDefaultCharset ISO-8859-1 par AddDefaultCharset UTF-8, (dans httpd.conf sinon rajoutez la ligne dans le .htaccess)
    • ou/et dans PHP avec header('Content-Type: text/html; charset=utf-8');
  • Mettre après le <head> dans votre fichier HTML le code suivant (ce code est connu de tous)
    • <meta content="text/html; Charset=UTF-8" http-equiv="Content-Type" />

MySQL


  • Ensuite, il faut premièrement changer les interclassements
    • de la base
      • ALTER DATABASE nomBase CHARACTER SET UTF8
    • des tables
      • ALTER TABLE nomTable CHARACTER SET UTF8
    • des colonnes
      • ALTER TABLE nomTable CONVERT TO CHARACTER SET UTF8
      • ceci changera toutes les colonnes de la table et convertira les données. Si vous aviez déjà mis de l’UTF8 dans une colonne avant d’en changer l’encodage il est encore possible de rétablir la cohérence des données :
        • ALTER TABLE nomTable CHANGE nomColonne nomColonne BLOB;
          ALTER TABLE
          nomTable CHANGE nomColonne nomColonne TEXT CHARACTER SET UTF8;
  • Puis il faut prévenir MySQL que vos interractions se feront en UTF8 en envoyant à chaque connexion :
  • SET NAMES UTF8

Editez en UTF8


Pour cela il faut configurer votre éditeur pour que vos fichiers soient en UTF8 (c’est nécessaire uniquement dans le cas de fichiers avec données sensibles - cad avec accents ou autres caractères non ASCII).

Veillez à placer l’encodage en UTF8 sans BOM car sinon le fichier contiendra un octet d’entête et PHP ne pourra plus envoyer de header ou de session (bug PHP#22108).
Encodage : convertir un site en UTF8 - PHP/MySQL

Developpez en PHP


Attention, une fois que votre site est en UTF-8 il va falloir changer quelques habitudes de développement :
  • jetez un coup d’oeil à l’extension Mbstring, par exemple pour strlen, utilisez mb_strlen
  • Comme l'a dit irnine94 dans son commentaire, faites bien attention car certaines fonction prennent en paramètre un charset qui par défaut est l'ISO vous devrez donc passer en paramètre UTF-8, comme par exemple la fonction htmlentities

Bonne chance à vous, et gardez à l'esprit que l'idée générale est d'avoir de l'UTF8 à tous les endroits de votre application.


Mercredi 29 Août 2007
Francescu e Dume



1.Posté par Exposa le 22/08/2008 19:38
Bonjour, il y a une facon de faire les modif dans mysql sans devoir taper un par un les ALTER?, car j'ai une base enorme (190 tables)

merci pour l'article.

2.Posté par laurent le 01/09/2008 11:02
Excellent la couverture ! J'ai éclaté de rire tout seul à mon bureau :))

L'encodage UTF-8... Ah ! que de souvenirs heureux, BOM sans BOM. BOM signifie Byte Order Mark ou Marque d'ordre des octets en FR.

Merci
A+


3.Posté par Michel le 15/09/2008 16:35
Cette page est encodée en iso-8859-1 et pas UTF-8, ce qui prouve que l'UTF-8 est loin de faire l'unanimité!

4.Posté par Francescu SANTONI le 22/09/2008 11:29
Ca y est notre plateforme de CMS (Webzine Maker http://www.wmaker.net) a basculé son appli en UTF-8 !

Michel est un devin ?
http://www.aquatz.com

5.Posté par Papasse le 20/11/2008 11:57
Alors 1. cet article m'a bien aidé, 2. la couverture Martine est hilarante et m'a mis de bonne humeur pour la journée !

Donc merci !
http://www.netteo.net

6.Posté par irnine94 le 22/11/2008 23:12
Très bon résumé, rapide, clair et simple.
Si je puis me permettre, ça serait bien de rajouter qu'il faut indiquer à certaines autres fonctions, du style htmlentities ou html_entity_decode le charset utilisé. Par défaut, c'est iso-8859-1, et il faut donc le passer à utf-8. Ca m'a prit la tête toute la journée, pour au final deux petits paramètres ; donc, je pense que ça serait bien de le préciser. =)
http://moinsde15ans.franceserv.com/beta forum/

7.Posté par nico le 03/12/2008 18:19
Bravo, merci pour cette explication concise que j'ai suivi pas à pas. Une question, pourquoi les accents sont stockés de la manière é en base (phpMyAdmin ou ligne de commande) ? Cela signifie donc qu'aucune modification via phpMyAdmin n'est envisageable ?
Merci

8.Posté par rapsys le 13/01/2009 23:17
@nico:
Les é en base veullent dire que tu as de l'utf-8 stocké comme iso8859-15.

Pour faire simple tu as une conversion iso8859-15 => utf-8 de trop.

La procédure est de passer ta table en latin1, puis de faire le passage vers BLOB/VARBINARY, puis de remettre de l'utf-8 TEXT/VARCHAR et enfin remettre la table en utf-8

Une solution goret est de faire un script php qui va récupérer l'intégralité du contenu (avec une requête SET NAMES latin1), puis passer en utf-8 (SET NAMES utf8), puis d'updater le tout si tu as des difficultés avec les alter table.

N'oubliez JAMAIS de bien faire vos BACKUP AVANT toute modification !
http://rapsys.eu/

9.Posté par Vin's974 le 23/01/2009 08:00
Moi je trouve que c'est bien expliqué, mais en revanche, je ne maitrise pas beaucoup MySql, donc je ne sais pas faire certaines choses. C'est dommage, mon problème persiste toujours :(

10.Posté par Jill-Jênn le 17/02/2009 16:38
Merci pour cet article (effectivement, la couverture était géniale ; c'est dommage, je viens d'apprendre que le site qui en proposait, http://martine.logeek.com/index.php, a dû fermer) !

Quand on a fait ça :
ALTER TABLE nomTable CONVERT TO CHARACTER SET UTF8
Si on veut corriger un champ TEXT initialement en Latin-1, au lieu de faire ça :
ALTER TABLE nomTable CHANGE nomColonne nomColonne BLOB;
ALTER TABLE nomTable CHANGE nomColonne nomColonne TEXT CHARACTER SET UTF8;
il faut repasser en Latin-1 d'abord, ce qui donne :
ALTER TABLE nomTable CHANGE nomColonne nomColonne TEXT CHARACTER SET LATIN1;
ALTER TABLE nomTable CHANGE nomColonne nomColonne BLOB;
ALTER TABLE nomTable CHANGE nomColonne nomColonne TEXT CHARACTER SET UTF8;
http://mickay.jill.free.fr/score/

11.Posté par Antoine T le 10/04/2009 17:58
Coucou,

si vous cherchez à détecter la présence de caractères BOM sur votre site, je vous propose le script suivant :
http://libre-d-esprit.thinking-days.net/2009/03/et-bom-le-script/

++

Antoine
http://libre-d-esprit.thinking-days.net/

12.Posté par Cécile le 07/08/2009 19:48
Bonjour et merci pour cet article. Je fais un site sous Spip, je n'y connais vraiment pas grand chose en base de données et j'ai tout compris.
En transférant le site du local (tables et colonnes en latin1, données envoyées en UTF8) sur le serveur, c'était le bazar... maintenant, c'est parfait :)

Nouveau commentaire :