Comportement bizar des accentuations [Résolu]

Signaler
-
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010
-
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

Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

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.
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

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)
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Je parle des flux rss que tu vas chercher. Via simplexml_load_file()
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

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.

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 ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.

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 ???
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.

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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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 ?

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 ?

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>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
On peut voir un extrait de tes flux rss ? Liens, descriptif, titre...enfin, un extrait complet.

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 ;

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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.

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
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

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.

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....