[fr]
Description de comment je me suis sortie des problèmes d'encodage qui résultaient en l'affichage de hiéroglyphes sur tous les sites hébergés sur mon serveur.
[en]
It took weeks, mainly because I was busy with a car accident and the end of school, but it also took about two real whole days of head-banging on the desk to get it fixed.
Here’s what happened: remember, a long time ago, I had trouble with stuff in my database which was supposed to be UTF-8 but seemed to be ISO-8859-1? And then, sometime later, I had a weird mixture of UTF-8 and ISO-8859-1 in the same database?
Well, somewhere along the line this is what I guess happened: my database installation must have been serving UTF-8 content as ISO-8859-1, leading me to believe it was ISO-8859-1 when it was in fact UTF-8. That led me to try to convert it to UTF-8 — meaning I took UTF-8 strings and ran them through a converter supposed to turn ISO-8859-1 into UTF-8. The result? Let’s call it “double-UTF-8″ (doubly encoded UTF-8), for want of a better name.
Anyway, that’s what I had in my database. When we upgraded MySQL and PHP on the server, I suddenly started seeing a load of junk instead of my accented characters:
What I was seeing looked furiously like UTF-8 looks when your server setup is messed up and serves it as ISO-8859-1 instead. But, as you can see on the picture above, this page was being served as UTF-8 by the server. How did I know it wasn’t ISO-8859-1 in my database instead of this hypothetical “double-UTF-8″? Well, for one, I knew the page was served as UTF-8, and I also know that ISO-8859-1 (latin-1) served as UTF-8 makes accented characters look like question marks. Then, if I wanted to be sure, I could just change the page encoding in Firefox to ISO-8859-1 (that should make it look right if it was ISO-8859-1, shouldn’t it?) Well, it made it look worse.
Another indication was that when the MySQL connection encoding (in my.cnf) was set back to latin-1 (ISO-8859-1), the pages seemed to display correctly, but WordPress broke.
The first post on the picture I’m showing here looks “OK”, because it was posted after the setup was changed. It really is UTF-8.
Now how did we solve this? My initial idea was to take the “double-UTF-8″ content of the database (and don’t forget it was mixed with the more recent UTF-8 content) and convert it “from UTF-8 to ISO-8859-1″. I had a python script we had used to fix the last MySQL disaster which converted everything to UTF-8 — I figured I could reverse it. So I rounded up a bunch of smart people (dda_, sbp, bonsaikitten and Blackb|rd — and countless others, sorry if I forgot you!) and got to work.
It proved a hairier problem than expected. What also proved hairy was explaining the problem to people who wanted to help and insisted in misunderstanding the situation. In the end, we produced a script (well, “they” rather than “we”) which looked like it should work, only… it did nothing. If you’re really interested in looking at it, here it is — but be warned, don’t try it.
We tried recode. We tried iconv. We tried changing my.cnf settings, dumping the databases, changing them back, and importing the dumps. Finally, the problem was solved manually.
- Made a text file listing the databases which needed to be cured (dblist.txt).
- Dumped them all:
for db in $(cat dblist.txt); do mysqldump --opt -u user -ppassword ${db} > ${db}-20060712.sql; done - Sent them over to Blackb|rd who did some search and replace magic in vim, starting with this list of characters (just change the browser encoding to latin-1 to see what they look like when mangled)
- Imported the corrected dumps back in:
for db in $(cat dblist.txt); do mysql -u user -ppassword ${db} < ${db}-20060712.sql; done
Blackb|rd produced a shell script for vim (?) which I’ll link to as soon as I lay my hands on the URL again. The list of characters to convert was produced by trial and error, knowing that corrupted characters appeared in the text file as A tilde or A circonflexe followed by something else. I’d then change the my.cnf setting back to latin-1 to view the character strings in context and allow Blackbr|d to see what they needed to be replaced with.
Thanks. Not looking forward to the next MySQL encoding problem. They just seem to get worse and worse. (And yes, I do use UTF-8 all over the place.)
Similar Posts:
- Converting MySQL Database Contents to UTF-8
- Invalid argument supplied for foreach() in wp-capabilities.php: Case Cracked!
- MediaWiki
- WordPress wp-login.php Problem
- Requirements for a WordPress Installer Script
- Trying the Disqus WordPress Plugin
- Static? Dynamic?
- Multilingual
- WPML to Make Your WordPress Site Multilingual
- Michael Hampton is My Hero of the Day








Intégrer coComment sur votre blog
Vous savez probablement que je ne jure que par coComment, dans la genèse duquel j’ai eu la chance de jouer un petit rôle.
Ça sert à quoi?
Ça sert principalement à choses pour l’instant:
collectionner ses commentaires faits sur différents blogs en un seul endroit, comme on peut le faire en les bookmarquant avec del.icio.us, mais de façon bien plus pratique;
voir facilement si quelqu’un d’autre a répondu à un de nos commentaires — mais attention, ceci ne marche pas très bien pour l’instant, car coComment est seulement capable de suivre les commentaires de gens ayant un compte coComment.
S’inscrire
Ouvrir un compte, c’est super facile, il suffit de donner nom et e-mail et de choisir un nom d’utilisateur et un mot de passe.
On notera qu’il n’est pas nécessaire d’avoir un blog pour trouver une utilité à coComment. Il y a des personnes qui participent activement à la blogosphère à travers leurs commentaires, sans pour autant être blogueurs. CoComment est pour vous!
Rendre coComment plus pratique
Une fois le compte ouvert, coComment vous fournit un bookmarklet, une sorte de lien “favori” que vous pouvez faire glisser dans la barre d’outils de votre navigateur ou dans vos favoris. Ensuite, quand vous laissez un commentaire chez quelqu’un, vous cliquez sur le bookmarklet dans votre navigateur avant de publier le commentaire.
Ça, ça devient très vite barbant. On oublie de cliquer sur le bookmarklet. Du coup, notre commentaire n’apparaît pas sur notre page de conversations coComment. Il paraît qu’on peut maintenant cliquer sur le bookmarklet après avoir envoyé le formulaire, mais personnellement je n’ai pas testé.
Les commentateurs peuvent faire quelque chose pour se simplifier la vie. Les auteurs de blogs peuvent faire quelque chose pour simplifier la vie de leurs commentateurs.
Plus pratique pour moi qui laisse des commentaires
Pour ça, il faut utiliser Firefox. Deux solutions s’offrent à vous.
Le script GreaseMonkey. Ce script vous évite de devoir cliquer sur le bookmarklet à chaque fois. Vous pouvez donc oublier coComment quand vous laissez vos commentaires, c’est tout automatisé. Sympa, non?
Script, GreaseMonkey, chinois? Pas peur, instructions pour les nuls. D’abord, installer l’extension GreaseMonkey (non, ça fait pas mal). Pour ça, on commence par s’assurer que l’on a Firefox 1.5 (voir lien ci-dessus), puis on va sur le site de l’extension GreaseMonkey. Une fois là -bas, on cliquera sur le lien qui s’appelle “Install GreaseMonkey” dans la deuxième moitié de la page. On dit oui à tout ce que nous demande Firefox (oui on veut installer l’extension, oui, oui, OK on ferme le navigateur et on le rouvre…)
Ensuite, on clique sur ce lien-ci qui va installer le script et on dit également oui à tout.
Voilà ! C’est fait
L’extension Firefox pour coComment. Même chose que plus haut, on clique sur le lien, on clique ensuite sur “Download coComment! for Firefox”, et on dit oui, amen à tout ce que nous demande notre navigateur chéri. L’extension me paraît moins utile que le script GreaseMonkey, car elle ne fait qu’ajouter le bookmarklet coComment au menu contextuel qui apparaît lors d’un clic droit (ou long clic pour les personnes qui ont un Mac). Mais il paraît que c’est utile parfois lorsque les commentaires sont dans une fenêtre pop-up. Personnellement, j’ai vu que ça ne marchait pas tout le temps, mais j’essaie quand même.
Note: j’ai désactivé l’extension Firefox vu que je ne l’utilise pas. A vous de voir si elle vous sert.
Plus pratique pour moi qui ai un blog
Si vous avez un blog, vous pouvez faire en sorte que vos commentateurs, s’ils ont un compte coComment, n’aient pas besoin de cliquer sur le bookmarklet, même s’ils n’ont pas installé l’extension GreaseMonkey décrite ci-dessus. Cool, non? Pour cela, il faut rajouter du code javascript pas trop loin du formulaire de commentaires.
Le code est fourni à la fin de ce billet par Merlin. Comme j’utilise une version assez standard de WordPress, je n’ai eu personnellement qu’à copier-coller ce qui était donné dans le billet. Bon, faut encore voir si ça fonctionne
Attention, donc, si vous avez un autre outil de blog, il faut peut-être adapter le code. Cet autre billet explique plus précisément quel rôle joue chaque ligne et vous aidera certainement à modifier le code si nécessaire.
Attention!
Pour le moment, j’arrive pas à faire marcher ça. Plus de nouvelles dès que c’est réglé.Ça marche maintenant, mais il faut faire attention aux guillemets malins pas si malins quand ils sont dans du code…Oui mais… DotClear, autres plateformes de blog, etc…?
Pas de panique. Premièrement, il faut savoir que les gars de coComment bossent d’arrache-pied pour augmenter le nombre de plate-formes avec lesquelles ils sont compatibles. Si votre blog n’est pas compatible avec coComment, mais que vous pouvez modifier votre formulaire de commentaires, tout n’est pas perdu.
Le dernier billet que j’ai mentionné explique comment faire. Il faut donc rajouter un certain nombre de lignes javascript dans le formulaire, et voilà ! Je suis certaine que DotClear fournit toutes les informations nécessaires mais avec d’autres noms que ceux auxquels s’attend coComment. Il suffirait donc qu’un(e) DotClearien(ne) prenne le taureau par les cornes et adapte le javascript aux variables de DotClear (la version publiée utilise les variables WordPress). Si vous faites ce travail, rendez-le public sur votre blog, et je lancerai un lien dans se direction! Qui s’y colle?
Mise à jour: Nicolas propose en commentaire le code à intégrer à DotClear. Quelqu’un peut confirmer que ça marche?
Similar Posts: