Les problèmes de charset sont une véritable plaie.

charset=iso-8859-1 ou charset=utf-8 ?

La question qu'il convient de se poser en premier lieu est : charset=iso-8859-1 ou charset=utf-8 ?
La difference entre ces deux charset est que l'iso-8859-1 (ou latin1) ne comporte que les charactères occidentaux. Impossible donc de faire des symboles japonais avec.
Cela vient du fait qu'il code les caractères sur un nombre de bit limité et qu'il n'y a littéralement pas assez de combinaison possible pour représenter tous les caractères du monde.
L'utf-8 (défini pour les caractères Unicode) est lui codé comme son nom l'indique sur 8 bit (ses grand frère utf-16 et utf-32 sont sur 16 et 32). Il permet de représenter beaucoup plus de caractères.
L'inconvénient est que les caractères sont représentés en UTF-8 par des séquences d'octets de taille variable, ce qui rend certaines opérations sur les chaînes de caractères plus compliquées.
UTF-8 peut aussi prendre plus de place pour les caractères "non-occidentaux", ou plus généralement non américain, mais c'est négligeable...

Pour conclure, si votre site est et restera francais, vous pouvez utiliser du latin1, mais c'est risquer d'aller vers des difficultés de compatibilité avec par exemple une base de donnée, une autre source d'information utilisant un encodage different etc... (le latin1, c'est du latin, si vous dialoguez avec du russe ca va pas le faire !)
De nos jours, le meilleur choix à adopter dans une application normale est sans doute d'utiliser l'UTF-8 partout. (ok c'est discutable...)

Problème d'encodage : éôéÃ

Si vous voyez ce genre de caractères etonnant à la place de vos accent ou caractère speciaux, pas de doute : votre texte a été encodé en UTF-8 et vous tentez de l'afficher en latin1.
Par exemple, l'accent é en latin1 correspond dans la table UTF-8 aux deux lettres : é, d'ou l'affichage étrange...

D'ou cela peut venir ?

L'encodage est à spécifier dans beaucoup d'endroit, il ne faut en oublier aucun.
Je pars du principe que tout vos fichier sont en UTF-8, et que l'on se place dans l'utilisation classique d'un site HTML/PHP/MYSQL

Encodage de MYSQL

Attention, il y a ici 2 encodages à surveiller.

  • Le premier, le plus évident, est le charset (et l'interclassement au passage) de votre base de donnée, de vos tables et de vos champs.

Verifiez donc qu'ils soient bien tous en UTF-8
Si ce n'est pas le cas, inutile de s'affoler, la commande SQL suivante est pour vous : ALTER DATABASE/TABLE la_data_base/la_table CHARACTER SET UTF-8 COLLATE utf8_bin
(rappel : COLLATE spécifie l'interclassement : c'est l'ordre alphabétique utilisé par mysql quand vous faites un ORDER BY dans mysql. Par exemple cela spécifiera si le "ç" vient avant ou apres le "c")

  • Le second est le jeux de caractère utilisé pour la connexion avec mysql.

Pour le spécifier il faut rajouter juste après votre connexion mysql une requete qui contient : "SET NAMES UTF8"
Vous pouvez aussi le mettre dans le fichier de conf de mysql de base pour ne pas avoir a le taper à chaque fois :
Dans /etc/mysql/my.conf rajouter :

  1. init-connect='SET NAME utf8'
  2. character-set-server=utf8
  3. collation-server=utf8_general_ci

Voila, votre BDD est prête
(un tuto ici qui reprend les bases pour les jeux de caractères avec mysql )

Encodage du fichier

  • Cette partie est primordiale, il faut vérifier que votre fichier est enregistré dans le bon encodage.

Pour cela ouvrez votre éditeur de texte préféré et regarder l'encodage d'enregistrement de vos fichier.

Entête html

Il faut ensuite signaler à votre navigateur dans l'entête le type d'encodage à utiliser
Si l'on dit qu'on est en XHTML, cela donne dans les <header></header> : <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

Entête php

L'entête du fichier peut aussi être modifié en php avec la commande header().
Si vous le faites vérifier à bien spécifier le charset=utf-8

Entête htaccess

Enfin l'entete des fichiers peut être forcé dans votre htaccess. Si c'est le cas vérifiez qu'il s'afit bien de UTF8 et non latin1.

Le problème des emails

Le problème de l'UTF-8 dans les emails est que certains webmails ne comprennent pas l'UTF-8..
Dans tous les cas, voici ce qu'il faut rajouter obligatoirement à votre entête email : (je suppose qu'on utilise mail() en php)

  1. //astuce pour configurer correctement les retours à la ligne en fonction des differents serveurs web :
  2. if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)){
  3. $passage_ligne = "\r\n";
  4. }
  5. else{
  6. $passage_ligne = "\n";
  7. }
  8. //encodage à proprement parler
  9. $entete .= "Content-Type: text/html; charset=\"UTF-8\"".$passage_ligne; //charset normal
  10. $entete .= "Content-Transfer-Encoding: 8bit".$passage_ligne; //obligatoire si vous voulez que les accents passent

Normalement cela devrait suffir à tout faire fonctionner.
Malgrès cela j'ai eu pas mal de soucis, et j'ai parfois du magouiller en utilisant la fonction utf8_encode et decode de php...