Petit tutoriel : convertir un site en UTF-8

Petit tutoriel : convertir un site en UTF-8 (le 18 septembre 2008)

Voici un rapide tutoriel pour passer vos sites au tout UTF-8.

Pour comprendre la relative complexité (on imagine que ce n'est qu'une ligne "meta" à changer... au début), il faut avoir à l'esprit une chose que je vais essayer de vulgariser de mon mieux : l'encodage est en quelque sorte la "langue" dans laquelle les différents intervenants vont traduire les 0 et les 1 qu'ils s'échangent, pour vous les afficher de manière intelligible.

Pour plus d'information à ce sujet, je vous renvoie sur Openweb lire ceci : Introduction aux jeux de caractères.

Pour l'utilisateur, c'est assez simple... mon navigateur... et le site à afficher doivent se comprendre.
Pour le développeur du site, c'est un petit peu plus complexe.

Je suis parti de l'idée somme toute "logique" que tout le monde allait devoir parler la même langue, l'UTF-8 donc.
C'est là que le tout se complique, il y a plusieurs acteurs dans cette "discussion" pour faire tourner mon site :

  • XHTML, qui structure le contenu,
  • PHP, qui donc est le langage dynamique,
  • MySQL, la base de données,
  • Les fichiers du site, exemple : index.php
  • et Apache, le serveur qui fait tourner tout ce joli monde.

L'idée est de faire discuter chacun dans la même langue afin qu'ils se comprennent... dès qu'ils échangent des données.

Première chose à faire... tout sauvegarder ! Bases de données, fichiers, il faut y aller franchement, cela ne coûte rien.

Première chose à changer, il faut dire à Apache de nous "donner" de l'UTF-8, ça n'est pas le cas par défaut (c'est de l'ISO). Comme je n'ai pas accès à la configuration d'Apache, cette étape se résume à changer le header envoyé par défaut par le serveur.

header("Content-type: text/html; charset=UTF-8"); si vous servez votre site comme text/html,
header("Content-type: application/xhtml+xml;"); si vous servez votre site comme une application/xhtml+xml, comme le mien.

Ensuite, la base de données... il faut savoir que MySQL peut gérer l'encodage des données (la langue dans lesquelles elles sont "adaptées"), et la collation, l'interclassement en français : comment se comporter avec ces données (comment "comparer" un "é" et un "e", comment gérer la casse, etc...). En gros, les règles de la "langue" choisie, pour reprendre l'analogie.

Bon, là, c'est simple (quoique un peu rébarbatif), utilisez PHPmyAdmin, il faut aller dans "operations" (pour la base et pour chaque table), et changez l'interclassement. Ensuite, il faut également faire de même pour chaque champ le nécessitant (exemple, des champs de type texte).
Pour ma part, j'ai pris utf8-general-ci. Je n'ai pas besoin que ce soit sensible à la casse dans MySQL pour mon site (un "E" est égal à un "e"), d'où le ci (=case insensitive en anglais).
Pour information, utf8-general-cs veut donc dire case sensitive, et utf8_general_bin signifie un classement binaire, donc pas d'interclassement à proprement parler.

Attention, cela ne veut pas dire que mon site ne gèrera pas les majuscules ou les minuscules (rien à voir), cela "explique" à MySQL (et à MySQL uniquement) comment gérer lui ces données !

A noter, si vous voulez forcer MySQL à utiliser l'UTF-8, il suffit de lancer cette requête avant toute autre :
SET NAMES 'utf8';

(sans rentrer dans les détails, cette requête "magique" aura le bonheur au passage de dire à MySQL de tout convertir, interpréter et envoyer en UTF-8... donc n'ayez pas peur de vous en servir)

Après, PHP... là, c'est un peu le cirque : PHP travaille nativement en ISO, ce n'est qu'à partir de la v6 qu'il basculera entièrement en UTF-8.
Deux modules permettent de gérer différents types d'encodages, mbstring et iconv.

mbstring s'occupe de la manipulation de chaînes tandis qu'iconv permet de convertir différents types d'encodages. Les conversions entre ISO et UTF-8 peuvent se réaliser à l'aide des fonctions utf8_encode() et utf8_decode(), qui vont bien souvent vous sauver la mise.

Un exemple : les données de FAQ du SOC (mon générateur de formulaires) doivent être affichées en ISO-8859-1, or elles arrivent en UTF-8 depuis ma base de données. L'utilisation de utf8_decode() m'a permis d'afficher ces données de manière lisible, sans "é" à la place de certains caractères accentués.

Le bout du tunnel se rapproche... pour XHTML, c'est assez simple dans mon cas :
<meta http-equiv="content-Type" content="application/xhtml+xml;" /> pour le servir en application/xhtml+xml (le cas de mon site si vous utilisez un navigateur le gérant), en n'omettant pas le prologue XML <?xml version="1.0" encoding="utf-8"?> , ou
<meta http-equiv="content-Type" content="text/html; charset=UTF-8" /> pour le servir en classique text/html.

Il reste enfin à s'occuper des fichiers du site, eux aussi doivent être encodés en UTF-8, notamment pour que le texte écrit "en dur" soit bien interprété, vu que tout le site va parler dans "la langue" UTF-8, les fichiers doivent également s'y plier.
Là, il vous suffit de trouver un éditeur de code qui gère cela, PSPad le fait par exemple très bien (dans PSPad, allez dans "format", cliquez sur UTF-8, et sauvegardez.

Attention, certains éditeurs spécifient en début de fichier un marqueur d'ordre des octets (BOM en anglais). C'est inutile pour l'UTF-8, et même dangereux : le fait d'insérer ce caractère au début d'un fichier php (donc avant la balise d'ouverture <?php) pourra provoquer une erreur du type "headers already sent"... à fuir de toute urgence !

La plupart des navigateurs usuels gèrent bien cet encodage, même IE 6, c'est dire.

Normalement, vous devriez arriver à vos fins avec tout cela, d'autres tutoriels sont disponibles sur le web si vous avez des besoins plus spécifiques, notamment configurer Apache, etc... mais là, je vous laisse chercher !

Permalien :

Flux RSS des commentaires de ce billet : https://www.nicolas-hoffmann.net/rss/commentaires.php?id_news=1164


Aucun commentaire pour le moment.

Ajouter un commentaire









L'option « Se souvenir de mes informations » utilise un cookie, elle ne sera pas effective si vous les avez désactivés.

Les balises HTML ne seront pas interprétées, il est donc inutile d'en mettre. Par contre, les sauts de lignes de votre commentaire seront pris en compte, ne mettez donc pas de <br />, le site s'en chargera. Bien sûr, un commentaire vide ne sera pas ajouté !

L'auteur (autrement dit moi) n'est pas responsable des éventuelles fautes d'orthographe dans les commentaires.
Tout propos raciste et/ou insultant sera supprimé sans préavis. Les commentaires hors de propos destinés à faire de la pub pour des sites seront également supprimés sans ménagement.

Je vous prie de me pardonner, j'ai énormément de mal à lire le "langage" SMS, il n'est donc pas du tout interdit de s'abstenir de l'utiliser. Qui plus est, vous avez sûrement un clavier digne de ce nom et pas celui d'un téléphone portable. Ne vous gênez pas pour utiliser l'option "Prévisualiser" si vous voulez vous relire avant de poster, je vous en remercie d'avance !

Cet article a été écrit par Nicolas Hoffmann.

Ce site est la propriété de Nicolas Hoffmann.
Tous droits réservés, les textes du blog sont publiés sous licence CC BY-NC-SA.