Bonjour,

N'ayant pas trop l'habitude d'écrire sur ce forum, mais plûtot de venir lire, je poste ici pour ne pas me tromper d'endroit...

Le but de mon post fait suite à une longue prise de tête à cause d'une toute petite apostrophe Smiley decu . En effet, j'avais un problème d'affichage dans le navigateur avec une apostrophe. htmlentities n'y faisait rien, et impossible de remplacer le caractère avec str_replace.

Après des heures à m'arracher quasiment tous les cheveux pour comprendre pourquoi cette apostrophe ne s'affichait pas correctement, j'ai finalement compris grâce à votre forum qu'il s'agissait d'un problème d'encodage.

En effet j'avais extrait des données d'un fichier CSV qui a pu être saisi en partie via Word pas par moi)... Je rappelle pour info que Word remplace les cotes par des sortes d'apostrophes non standard dirons nous, du Microsoft quoi...Du coup j'avais des apostrophes parasites qui ne s'affichaient pas correctement, et impossible à remplacer, puisque non détectées en tant que '.

Je n'ai pas trouvé de code clair qui ait fonctionné, mais j'ai finalement réussi à faire ce que je voulais très simplement. J'ai donc pensé que je pourrais vous faire partager le code qui m'a sauvé la vie, si jamais ça vous arrive un jour :
$chaine = str_replace("’" , "'", $chaine);


J'ai ruiné ma soirée pour une apostrophe lol, mais au moins je vais pouvoir aller me coucher l'esprit tranquille !! Smiley biggrin
Modifié par Vainsang (26 Feb 2008 - 03:33)
Bonjour,

Tu es sûr que tu ne confonds pas l'apostrophe droite informatique (celle que j'utilise pour écrire ce texte et qui sur un clavier français se trouve sur la même touche que le chiffre 4) et l'apostrophe typographique qui est la seule qui devrait normalement être utilisée pour composer un texte?

Un peu de lecture:
http://fr.wikipedia.org/wiki/Apostrophe_(typographie)#Codage_informatique

Bref, le comportement de Word est parfaitement normal vu qu'il s'agit d'une aide à la composition typographique qui sans cela ne serait pas très aisée.
Le problème que ça pose, c'est que les contenus d'un site web sont souvent saisis directement dans une interface d'administration, et sauf à mettre en place un système de filtre tel que SmartyPants on peut se retrouver avec sur le site à la fois des apostrophes droites informatiques (abusives) et des apostrophes typographiques (correctes). D'où un petit problème de cohérence typographique.

PS: en passant, je ne suis pas sûr que le code que tu postes soit correctement visible avec tous les navigateurs et tous les systèmes. L'apostrophe typographique n'existe pas il me semble en ISO-8859-1 (l'encodage de ce forum) et il faut théoriquement la coder »... ou bien travailler en utf-8 par exemple.

Le caractère que tu as tapé ou copié-collé depuis Word a pour valeur hexadécimale 0x92 (ce qui se vérifie en téléchargeant la page directement et en vérifiant la valeur avec un éditeur hexadécimal), ce qui correspond à l'apostrophe typographique... en codage Windows-1252 (utilisé par défaut par Windows XP et inférieurs (à voir pour Vista) en langues occidentales, et je suppose par Word également). En iso-8859-1 (encodage déclaré pour cette page), cette valeur correspond à un caractère de controle, et donc l'apostrophe ne devrait pas être affichée. Mais comme les navigateurs ont l'habitude de se coltiner ce genre d'erreur, ils corrigent d'eux-même (testé avec Firefox 2, Konqueror 3.5 et Opera 9.25 sous Linux -- encodage système UTF-8).

L'article date un peu mais on pourra lire:
http://openweb.eu.org/articles/caracteres_illegaux/
a écrit :
Tu es sûr que tu ne confonds pas l'apostrophe droite informatique (celle que j'utilise pour écrire ce texte et qui sur un clavier français se trouve sur la même touche que le chiffre 4) et l'apostrophe typographique qui est la seule qui devrait normalement être utilisée pour composer un texte?


Toute cette lecture a été fort intéressante. Je ne m'étais jamais informé dans les détails sur les différents encodages, pourtant je vois bien aujourd'hui que le sujet est large intéressant et utile. J'ai donc en effet l'apostrophe informatique qui est correctement comprise par le navigateur, et apparemment pas l'apostrophe typographique (en tout cas avec l'encodage par défaut). J'ai bien essayé de mettre entre les balises head une déclaration d'encodage avec utf-8 et d'autres, mais ça n'a rien changé donc soit j'ai mal fait ma déclaration, soit c'est le format de mon document de départ qui doit être modifié.

a écrit :
Bref, le comportement de Word est parfaitement normal vu qu'il s'agit d'une aide à la composition typographique qui sans cela ne serait pas très aisée.


Oui il est normal, mais à 3 heures du mat hier soir, fallait que je râle après quelqu'un ou quelque chose et je trouve que pour ce genre d'activité Microsoft est un bon bouc emissaire, bien que je reconnaisse que ce qu'ils font fonctionne pas trop mal vu que j'utilise leurs produits...

a écrit :
PS: en passant, je ne suis pas sûr que le code que tu postes soit correctement visible avec tous les navigateurs et tous les systèmes. L'apostrophe typographique n'existe pas il me semble en ISO-8859-1 (l'encodage de ce forum) et il faut théoriquement la coder »... ou bien travailler en utf-8 par exemple.


Le problème c'est que je dois détecter ’ dans mon fichier source. Du coup avec un coup de str_replace, si je met "»" il va me chercher cette chaine je pense Smiley ohwell , du coup il faudrait une fonction php qui cherche des codes unicode et non une suite de caractères ASCII (je suppose que str_replace utilise l'ASCII mais n'en suis absolument pas certain).

Je viens aussi de voir qu'il existe des fonctions utf8_encode et utf8_decode, ça peut peut être servir... A explorer.

a écrit :
Le caractère que tu as tapé ou copié-collé depuis Word a pour valeur hexadécimale 0x92 (ce qui se vérifie en téléchargeant la page directement et en vérifiant la valeur avec un éditeur hexadécimal), ce qui correspond à l'apostrophe typographique... en codage Windows-1252 (utilisé par défaut par Windows XP et inférieurs (à voir pour Vista) en langues occidentales, et je suppose par Word également). En iso-8859-1 (encodage déclaré pour cette page), cette valeur correspond à un caractère de controle, et donc l'apostrophe ne devrait pas être affichée. Mais comme les navigateurs ont l'habitude de se coltiner ce genre d'erreur, ils corrigent d'eux-même (testé avec Firefox 2, Konqueror 3.5 et Opera 9.25 sous Linux -- encodage système UTF-8).


Il faudrait alors peut être que je réencode tout mon document en utf-8 avec les fonctions précitées pour être sur puis faire afficher la page en utf-8. Mais en y réfléchissant ça ne me semble pas simple, car si j'ai des morceaux en ISO 8859 (caractères classiques), et des morceaux en Windows-1252 (comme cette apostrophe par exemple) je ne sais pas ce qui va permettre de déterminer quel caractère est encodé dans quel code. Je sens que je ne suis plus clair dans mes propos, je préfère donc m'arrêter la pour le moment. Merci en tout cas pour ta réponse.
Hmm... si tes données sont en windows-1252 et que ton script PHP est aussi enregistré en windows-1252, la fonction que tu cites devrait marcher parfaitement.

Si tes données sont en iso-8859-1 et contiennent quelques valeurs n'appartenant pas à cet encodage comme la valeur 0x92 (apostrophe typographique en windows-1252), et que ton script PHP est en iso-8859-1 également sauf pour cette valeur 0x92 que tu utilises dans ta fonction... eh bien ça devrait marcher aussi: la fonction recherche 0x92, le trouve dans les données, et le remplace par la valeur souhaitée, à savoir 0x27 (apostrophe informatique droite).

Si tes données sont en iso-8859-1 avec valeur parasite 0x92 et que ton script PHP est en UTF-8, là ça va moins bien marcher. Et si tout est en UTF-8, ça marchera si les apostrophes typographiques sont bien enregistrées avec la valeur unicode et pas une valeur paraiste 0x92 (là, je ne sais pas trop comment ça se passe à partir d'un import de données depuis un fichier CSV en windows-1252...).

Bref, tout cela est très technique, on l'aura compris. Pour s'éclaircir les idées sur les concepts de base, on pourra lire le sujet qui est en post-it de ce salon: [Pré-requis] Notions de base sur l'encodage des caractères.