Comportement bizar des accentuations

Résolu
Utilisateur anonyme - 30 nov. 2008 à 09:40
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010 - 1 déc. 2008 à 00:34
Bonjour

J'ai une chaine de caractère que je récupére de flux RSS (dont j'ignore l'encodage) qui, après être passée dans cette moulinette :

$titre=utf8_decode($item->title);
$description =  SuppAccents(htmlentities($description));
$lien = htmlentities($lien);
$titre = SuppAccents(htmlentities($titre));
$tout.='<li>'.htmlentities($description).
       'Nancy: Calv&eacute; et F&eacute;ret dans le groupe (FIFA)</gras>

Le défenseur Jean Calvé et le milieu de terrain Julien Féret, absents à Nantes le week-end dernier, font partie du groupe de 16 joueurs de Nancy.</li>


Et ce que je comprends encore moins, c'est qu'il n'y a quand dans les titres que les accents ne passent pas.

Quelqu'un pourrait il, m'expliquer ?

Merci          

20 réponses

yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
30 nov. 2008 à 10:04
1/ récupère toi-même les différents flux Xml et stocke les dans un fichier pour les analyser.
2/ compare l'attribut "encoding" des fichiers Xml.

J'ai l'impression qu'il y a quelques confusions, j'éclaircis tout ça :
- il y a deux choses :
  * le codage des entités XML (&eacute;)
  * le charset (Iso-8859-1 ou Utf-8)
- ne te soucie *absolument pas* (du moins pas pour l'instant) du stockage dans la base de données. MySql a un mécanisme de conversion. Par défaut Php "cause" en iso-8859-1, MySql fera la conversion si les données sont stockées autrement. Une fois que tout marchera, tu pourras adapter le charset utilisé pour stocker les données - je répète, ça ne concerne que MySql.

Pour en revenir à ton pb :
- tes flux Rss contiennent vraisemblablement les accents sous la forme (encodée) &eacute; OU sous la forme (non-encodée) é. C'est pourquoi, selon le flux, ils n'apparaissent pas pareil.
- tes flux Rss sont vraisemblablement encodés en utf-8

Si ces 2 suppositions sont vraies, je te conseille :
* d'effectuer le utf8_decode au moment où tu *lis* ton flux Rss. A moins que tu ne modifies la connexion à la base de données, tu dois considérer que Php manipule des chaînes iso-8859-1. Donc tu fais les conversions nécessaires à la lecture (si tu lis depuis un "flux" utf-8) et à l'écriture (si tu écris dans un "flux" utf-8). Je parle de flux au sens large.
Ainsi tu donneras à MySql du iso-8859-1 (qu'il convertira si besoin en utf-8 pour le stocker, mais je répète encore ce n'est pas notre problème pour l'instant)
Par la suite, tu lis la donnée depuis MySql --> MySql te renvoie du Iso-8859-1, tu l'intègres dans ton mail en iso-8859-1 sans conversion
* de faire un html_entity_decode au moment où tu *lis* ton flux Rss, pour la même raison. Tu gardes ton htmlentities pour l'écriture du mail (car le contenu du mail doit être html_encodé - mais une seule fois)

Si tu n'arrives pas à t'y repérer, fais un petit schéma avec :
- MySql
- Connexion MySql-Php
- Php
- Flux rss
- mail
et indique à chaque emplacement (entrée, stockage et sortie) :
- d'une part si les données sont en Iso-8859-1 ou en utf-8
- d'autre part si elles sont en "texte brut" ou "encodés HTML"
Cela te permettra de voir où est-ce qu'il faut des conversions, et lesquelles.
3
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
30 nov. 2008 à 11:08
Pour le charset :
- pour bien faire, il faudrait parser le xml et analyser l'attribut "encoding".
Un preg_match('/<?xml.*encoding="(.*)"?>/') - à peaufiner - devrait te permettre de récupérer cette info.
- pour l'encodage des entités, un fichier xml est censé forcément les échapper - sinon le XML n'est pas valide; donc l'html_entity_decode doit être systématique. De toute façon (même si un créateur de flux a oublié d'"html_encode"r sa chaîne, tu ne crains rien à faire un html_entity_decode sur une chaîne déjà décodée (enfin, dans ce contexte en tout cas).
Un petit truc que j'ai remarqué : il y a certaines entités qui ne sont pas gérées par html_entity_decode; à tester, je pense notamment à &bull; &oelig;

Analyse déjà les flux que tu traites en appelant l'url directement et en faisant "Enregistrer sous", ça te donnera une idée du désastre (ou pas)
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 14:20
Je parle des flux rss que tu vas chercher. Via simplexml_load_file()
3
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
1 déc. 2008 à 00:34
Pour le schéma, mon frère m'a dit un jour "la première étape pour l'écriture d'un programme, c'est le papier". Et c'est vrai. Et d'autant plus que tu te heurtes à un problème dont tu as du mal à comprendre certains concepts; les poser sur papier permet de mieux les appréhender.

Pour le choix du charset dans le logiciel de mail : il y a les ignorants qui ne savent pas ce qu'est un charset, les sagouins qui l'ignorent, et les applications écrites avant l'émergence claire des charsets et sa généralisation. Il était un temps (pas très lointain) où les mails étaient prévus pour être des messages en texte brut en ASCII, donc sans besoin de préciser l'encodage...
Mais pour aller dans le bon sens, on va dire que oui, les applis aujourd'hui qui n'en tiennent pas compte sont des applis de sagouin.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
30 nov. 2008 à 10:27
Je comprends un peu mieux. MAIS est-ce donc passible de tester (par une fonction PHP) ce que me crache un flux XML ? de façon a le tester et prendre les dispositions qui vont bien ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 11:49
Hello,

je me permets de rectifier : XML ne "comprend" pas par défaut les entités HTML (car ce sont des entités HTML, et non pas XML : &eacute;, &agrave; etc...) : une DTD (ou un schéma) doit les définir en amont pour que ce soit le cas. A moins (et c'est le cas le plus souvent utilisé) de mettre les textNode dans des CDATA.
Toujours est-il qu'à mon avis aussi, tes flux rss sont en utf8. Un simple utf8_decode() devrait suffire.
Le mieux étant encore, à mon sens, de toujours fonctionner en utf8...en attendant un support parfait d'unicode dans PHP, c'est encore la meilleure alternative quand on traite des données multilingues (ce qui est probablement le cas avec des flux RSS).
Pour ce qui est de ne pas se soucier de l'encodage vis à vis de mysql, je ne suis pas tout à fait d'accord. Il faut toujours se soucier de l'encodage, et faire en sorte de le maîtriser du début à la fin. Cela se permet de se prémunir contre un quelconque changement d'attitude de tel ou tel applicatif lié à une mise à jour de version, et donc de rendre pérenne ses appliactions web.
0
Utilisateur anonyme
30 nov. 2008 à 11:54
bon j'ai essayé de regarder et ca marche toujours à moitier : je m'explique  :

Voici le code que j'ai :

<?php

function SuppAccents($chaine){
$tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜúûüÿÑñ";
$replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuyNn";
return(strtr($chaine,$tofind,$replac));
}

function lire_rss($url,$connexion)
{
    include($connexion);
  $tout.='';
  $xml = @simplexml_load_file($url) ;
  foreach($xml->channel->item as $item) {
    $i++;
   
    $txt=utf8_decode($item->description);
    $lien=utf8_decode($item->link);
    $titre=utf8_decode($item->title);

        $description =  SuppAccents(htmlentities($description));
        $lien = htmlentities($lien);
        $titre = SuppAccents(htmlentities($titre));
      $tout.='
      <li>'.htmlentities($description).
        'Basket/ProA: Rouen fait tomber Nancy, l'ASVEL &eacute;trille Le Mans (AFP Journal Internet via Yahoo! France Sport)</gras>

Le promu Rouen a créé la sensation samedi en dominant à domicile le champion en titre Nancy (85-78) lors de la 9e journée de ProA, le faux pas lorrain profitant à l'ASVEL, tombeuse du Mans (90-78) et qui complète le podium avec Orléans, vainqueur de Hyères-Toulon (96-73).
</li><li> Nancy: Calv&eacute; et F&eacute;ret dans le groupe (FIFA)

Le défenseur Jean Calvé et le milieu de terrain Julien Féret, absents à Nantes le week-end dernier, font partie du groupe de 16 joueurs de Nancy.
</li><li>=12smofevg/*http%3A//www.sport.fr/football/foo/Ligue-1-Nancy-Calve-et-Feret-dans-le-groupe-142275.shtm Nancy: Calv&eacute; et F&eacute;ret dans le groupe (Sport.fr)

Le défenseur Jean Calvé et le milieu de terrain Julien Féret, absents à Nantes le week-end dernier, font partie du g
</li>

*quelqu'un peut il m'expliquer pourquoi ma marche dans le contenu et pas dans les liens ???
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 12:12
Hello,

dans la description, tu appelles ta suppression d'accents sur un htmlentities()...sachant qu'htmlentities transforme tous les accents en entités, ça ne sert à rien.
Sur tes liens, tu fais juste un htmlentities, donc tu transformes tes accents en entités.
Ceci dit  j'ai un peu de mal à suivre ton code...il est assez tordu :-) Donc vu que j'ai la flemme d'aller au bout, je te dirais une seule chose : tu ne fais pas la même chose pour les liens, le titre, le descriptif...donc si l'un marche, applique aux autres ce que tu lui fais.
0
Utilisateur anonyme
30 nov. 2008 à 13:20
Tordu mon code ? ah bon :-)
tu parles d'entités, mais c'est quoi en terme PHP une entité ca je sais pas du tout (faut dire que j'ai appris ce langage tout seul et dur dur avec mes pb de santé)
effectivement j'avais meme aps vu que je faisais pas la meme chose (a force d'etre sur du code....)

je teste mes modifs
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 13:25
Ca n'est rien du tout en terme de php; c'est du html.
Une entité c'est la traduction d'un caractère spécial : é evient &eacute;
Cela permet théoriquement de faire comprendre le caractère quel que soit l'encodage.
Ceci dit je me suis trompé, j'ai mal lu ton code: html_entity_decode transformant les entités en caractères (accents ou autres); donc je n'ai rien dit là-dessus :-)
Mais je ne comprends vraiment tjrs pas pourquoi tu veux supprimer les accents ?
0
Utilisateur anonyme
30 nov. 2008 à 14:01
Bah en fait, avac tout ce que tu m'as dit et ce que j'ai réussi à faire, du coup je ne les supprime pas car ils arrivent correctement encodés dans le mail. Au depart je pensais les supprimer pour ne pas avoir de soucis d'encodage. Cependant, je pense à un truc : dans ls clients mail (outlook, incredimail, ....) on peut choisir l'encodage. Ce code qui marche maintenant, fonctionnera t il sur tous les cliens mail ou faut il que leurx choix d'encodage soit correct ?
0
Utilisateur anonyme
30 nov. 2008 à 14:03
j'ai dit une bétise : je croyais que ca marchait mais c'est encore pas encodé commem il faut : voila ce que j'ai :
<li>Basket/ProA: Rouen fait tomber Nancy, l'ASVEL &eacute;trille Le Mans (AFP Journal Internet via Yahoo! France Sport)

Le promu Rouen a créé la sensation samedi en dominant à domicile le champion en titre Nancy (85-78) lors de la 9e journée de ProA, le faux pas lorrain profitant à l'ASVEL, tombeuse du Mans (90-78) et qui complète le podium avec Orléans, vainqueur de Hyères-Toulon (96-73).
</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 14:12
On peut voir un extrait de tes flux rss ? Liens, descriptif, titre...enfin, un extrait complet.
0
Utilisateur anonyme
30 nov. 2008 à 14:17
bah oui et non : en fait, mes flux sont générés
Par contre je peux t'envoyer le fichier complet ca sera + simple,
-----------------------------
fichier de generation
-------------------------------
<?php

function SuppAccents($chaine){
$tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜúûüÿÑñ";
$replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuyNn";
return(strtr($chaine,$tofind,$replac));
}

function lire_rss($url,$connexion)
{
    include($connexion);
  $tout.='';
  $xml = @simplexml_load_file($url) ;
  foreach($xml->channel->item as $item) {
    $i++;
   
    $txt=utf8_decode($item->description);
    $lien=utf8_decode($item->link);
    $titre=utf8_decode($item->title);

        //$description =  SuppAccents(htmlentities($description));
        $txt = htmlentities(strip_tags($txt));
        $description =  SuppAccents($description);
        $lien = htmlentities($lien);
        $titre = SuppAccents(htmlentities($titre));
      $tout.='
      <li>'.htmlentities($description).
        ' '.htmlentities($titre).'

        '.htmlentities(strip_tags($txt)).' </li>';
           
    $description = strip_tags($description);
    $sql = "insert into rss_item(titre,lien,description) values ('$titre','$lien','$description')";
    sql_exec($sql);   
  }
  $tout.='';
   
  $position = strstr($tout,'

ensuite voici le schema de ma base
--
-- Structure de la table `rss_canal`
--

CREATE TABLE `rss_canal` (
  `title` text NOT NULL,
  `link` varchar(900) NOT NULL,
  `description` text NOT NULL,
  `language` text NOT NULL,
  `copyright` varchar(255) NOT NULL,
  `managingEditor` varchar(255) NOT NULL,
  `webMaster` varchar(255) NOT NULL,
  `pubDate` varchar(255) NOT NULL,
  `lastBuildDate` varchar(255) NOT NULL,
  `category` varchar(255) NOT NULL,
  `generator` varchar(255) NOT NULL,
  `docs` varchar(255) NOT NULL,
  `ttl` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  `rating` varchar(255) NOT NULL,
  `textInput` varchar(255) NOT NULL,
  `skipHours` varchar(255) NOT NULL,
  `skipDays` varchar(255) NOT NULL,
  PRIMARY KEY  (`link`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='balise <channel>';

--
-- Contenu de la table `rss_canal`
--

-- --------------------------------------------------------

--
-- Structure de la table `rss_flux_a_lire`
--

CREATE TABLE `rss_flux_a_lire` (
  `nro_flux` int(11) NOT NULL auto_increment,
  `url_flux` text NOT NULL,
  `lire` char(1) NOT NULL COMMENT 'Faut il le lire ou pas ?',
  PRIMARY KEY  (`nro_flux`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=50 ;

--------------------------------------------

--
-- Contenu de la table `rss_flux_a_lire`
--

INSERT INTO `rss_flux_a_lire` (`nro_flux`, `url_flux`, `lire`) VALUES

-- --------------------------------------------------------

--
-- Structure de la table `rss_item`
--

CREATE TABLE `rss_item` (
  `titre` text NOT NULL,
  `lien` varchar(900) NOT NULL,
  `description` text NOT NULL,
  `commentaire` text NOT NULL,
  `auteur` text NOT NULL,
  `pubdate` date NOT NULL,
  `guid` int(11) NOT NULL auto_increment,
  `source` text NOT NULL,
  `canal` text NOT NULL,
  PRIMARY KEY  (`guid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='items des flux' AUTO_INCREMENT=6372 ;
0
Utilisateur anonyme
30 nov. 2008 à 14:25
ah euh oui les voila. Mais ces flux, je n'ai pas la "main" dessus : ce sont des flux de divers organismes et y'en aura d'autres:





<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" />
<style>
<!--
BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:"Arial"; font-size:x-small }
-->
</style>
<colgroup>
<col width=\"864\" />
</colgroup>

----

http://news.search.yahoo.com/news/rss'ei=UTF-8&va=NANCY&fl=1&vl=lang_fr&n=10,

----

http://rss.goethe.de/?lang=fr&land=fr&ins=nan&typ=v,

----

http://www.eng.cityvox-nl.com/agenda_nancy/nancy_/RssEvenementsMajeurs,

----

http://www.nancy.fr/rss/rss_communiques_de_presse.php,

----

http://www.nancy.fr/rss/rss_agenda_loisirs.php?idcat=4,

----

http://www.nancy.fr/rss/rss_agenda_loisirs.php?idcat=5,

----

http://www.nancy.fr/rss/rss_agenda_loisirs.php?idcat=6,

----

http://www.grand-nancy.org/index.php?id=79&tx_push2rss3ds[channelId]=1&tx_push2rss3ds[encoding]=utf&cHash=af384cf69c,

----

http://www.speed-dating-nancy.com/flux.xml,

----

http://www.nancy.fr/rss/rss_agenda_loisirs.php,

----

http://www.lorraine.eu/jahia/Jahia/cache/offonce/pid/66;jsessionid=74B3407566AC692A8957FDDCAC62C91C/template/crlo_actu_rss_2_0.rss?vsite=1,

----

http://www.cr-lorraine.fr/jahia/Jahia/cache/offonce/pid/361;jsessionid=42C22539504F035AE9374B6DFB07D976/template/crlo_actu_rss_2_0.rss?vsite=1,

----

http://www.nancyinfo.org/total.rss,

----

http://www.nancyjazzpulsations.com/include/php/rss/rss_news.php,

----

http://www.nancyjazzpulsations.com/include/php/rss/rss_programmation.php,

----

http://www.zikinf.com/concerts/rss/?ville=nancy,

----

http://www.speed-dating-nancy.com/flux.xml,

----

http://www.grand-nancy.org/fileadmin/Templates/CUGN/images_accueil/rss.jpg,

----

http://www.jeunessemandoliniste.com/rss/actu_rss.php
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 14:28
Ceci dit, tu fais 2 fois htmlentities() sur certains textes. Or, "&" se transforme alors en "&amp;".
En fait, sur $lien par exemple : tu fais un htmlentities() dessus, puis un deuxième en le mettant dans $tout...$tout est retourné par ta fonction, et sur ce retour, tu fais un html_entity_decode()...Sincèrement, je le maintiens, c'est le bordel ton truc!
Vire toute modification des entites (je ne parle pas de l'encodage) et regarde ce que ça donne; après, on verra.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 14:33
Ok, on  est chaque fois en utf8 (normal à priori pour du rss), et les textNode sont dans des CDATA, avec les accents.
DONC...utf8_decode() pour ta base qui est en latin1
Puis selon ton affichage : utf8_encode() ou rien du tout.
A priori, tu n'as à t'inquiéter de rien d'autre.
simplexml a parfois la facheuse tendance a transformer ce qu'il peut en entités html...ce dont tu te fiches, puisqu'à l'affichage sur un client web, ces entités sont interpretées.
0
Utilisateur anonyme
30 nov. 2008 à 14:45
Ca à l'air bon là
Faut que je regarde sur plusieurs flux ce que ca donne mais effectivement tout à l'ai bien arrivé dans les mails
0
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
30 nov. 2008 à 21:52
malalam : Merci de m'avoir corrigé; effectivement, j'avais "oublié" le CDATA. Il n'y a à priori aucune raison pour que les accents soient html-encodés dans le xml. Avec du recul, je m'aperçois que j'ai pensé ça à cause des entités encodées qui posaient problème. Mais d'après ce que tu as l'air de dire, c'est peut-être plutôt simplexml qui les encodait.

slhuilli : à priori ton problème est complètement résolu. une question que tu as posée à laquelle je n'ai pas vue de réponse :
"Ce code qui marche maintenant, fonctionnera t il sur tous les cliens mail ou faut il que leurx choix d'encodage soit correct ?"
Je te rassure, ça marchera.
En fait, ce qui se passe, c'est que l'encodage utilisé est indiqué dans les en-têtes du mail (charset=iso-8859-1). Le client mail saura donc que tu lui envoies du iso-8859-1.
As-tu fait le schéma que je t'ai conseillé ? Crois-moi, tu y verras plus clair.
0
Utilisateur anonyme
30 nov. 2008 à 22:27
honnetement, pour le schema je ne l'ai pas fait car en fait.... je n'ai pas du tout compris ce que j'aurais pu  y mettre dessus.
et pour la réponse à ta question, effectivement c'est vrai que ca parait logiique maintenant que le client de messawagerie "lise" le charset utilisé. Mais alors a quoi donc sert ce choix sur les logiciels de messageries ?? C 'est pour les saguoins qui codent mal ?
et maintenant pour finir en beauté ... dodo ! demain est un autre jour PHP....
0
Rejoignez-nous