Bonjour à tous,
Nouveau venu (mais lecteur assidu), je souhaite partager un truc de développeur concernant UTF-8 qui m'aura bien pris la tête et qui peut être utile à nombre d'entre vous.
J'utilise UTF-8 dans mon application PHP et j'ai besoin de retraiter différents types de chaînes de caractères, parfois complexes. Grosso-modo, tout allait bien jusqu'à ce que, lors de mes tests, je commence à tester des chaînes tordues du style :
é&à"#-|<i>7è</i>\r\n'ù^e<br>$"£*" </textarea>blabla, etc...
Tout va bien, sauf... pour le caractère "à" qui devient "?"...
Bref, après plusieurs affichages sous différents encodages, utf8_decode, et autres détection automatique, j'en arrive au constat que ce n'est pas un problème de manipulation d'UTF-8 mais un problème au niveau du traitement de ma chaîne.
Il existe déjà un certain nombre de posts sur ce sujet, certains concernant des bugs dans des CMS reconnus, mais peu contenant une explication plausible et une solution valable.
Dont celui-ci : En utf-8 le caractère "à " devient "?"
Après plusieurs heures de recherche pour ce même problème (eh oui), je suis enfin tombé sur la bonne page: PHP character encoding ? sign instead of à
Il semblerait donc que l'encodage UTF-8 de "à" se fait sur 2 octets (comme pour les autres caractères accentués), mais que le second octet n'est autre qu'un espace blanc (non-breaking space), ce qui est un cas particulier. Je cite :
Pour le coup, j'ai fait ce que suggère l'auteur (Olivier Verdier, révérence) :
et donc modifié mon traitement "problématique" :
en :
Voilà, je ne sais pas si c'est très clair. Par contre, j'aurais bien aimé tomber rapidement sur cette explication chez Alsacréations, d'où ma contribution...
Modifié par adp (29 May 2013 - 17:19)
Nouveau venu (mais lecteur assidu), je souhaite partager un truc de développeur concernant UTF-8 qui m'aura bien pris la tête et qui peut être utile à nombre d'entre vous.
J'utilise UTF-8 dans mon application PHP et j'ai besoin de retraiter différents types de chaînes de caractères, parfois complexes. Grosso-modo, tout allait bien jusqu'à ce que, lors de mes tests, je commence à tester des chaînes tordues du style :
é&à"#-|<i>7è</i>\r\n'ù^e<br>$"£*" </textarea>blabla, etc...
Tout va bien, sauf... pour le caractère "à" qui devient "?"...
Bref, après plusieurs affichages sous différents encodages, utf8_decode, et autres détection automatique, j'en arrive au constat que ce n'est pas un problème de manipulation d'UTF-8 mais un problème au niveau du traitement de ma chaîne.
Il existe déjà un certain nombre de posts sur ce sujet, certains concernant des bugs dans des CMS reconnus, mais peu contenant une explication plausible et une solution valable.
Dont celui-ci : En utf-8 le caractère "à " devient "?"
Après plusieurs heures de recherche pour ce même problème (eh oui), je suis enfin tombé sur la bonne page: PHP character encoding ? sign instead of à
Il semblerait donc que l'encodage UTF-8 de "à" se fait sur 2 octets (comme pour les autres caractères accentués), mais que le second octet n'est autre qu'un espace blanc (non-breaking space), ce qui est un cas particulier. Je cite :
a écrit :
Here is my take on your problem. The letter à is encoded in two bytes in utf8. The first byte is xC3, which is à in latin-1, the second byte is... non breaking space! (The other accented letters, such as è are encoded by à followed by an other accented letter in latin-1, and they are not affected).
Therefore, my guess is that you have a script, somewhere, that removes, or replaces, the non-breaking space in latin-1, i.e., character xA0. The resulting lonely byte xC3 cannot be displayed properly, so the general placeholder ? is displayed instead. (just load your page in latin-1, you will see that I am right).
Pour le coup, j'ai fait ce que suggère l'auteur (Olivier Verdier, révérence) :
a écrit :
Find that script that removes non-breaking spaces, and you'll be fine.
et donc modifié mon traitement "problématique" :
$str = preg_replace('`[[:blank:]]{1,}`', ' ', trim($str));
en :
$str = str_replace('[[à]]', 'à', preg_replace('`[[:blank:]]{1,}`', ' ', str_replace('à', '[[à]]', trim($str))));
Voilà, je ne sais pas si c'est très clair. Par contre, j'aurais bien aimé tomber rapidement sur cette explication chez Alsacréations, d'où ma contribution...
Modifié par adp (29 May 2013 - 17:19)