Utilisateur anonyme
-
30 nov. 2008 à 09:40
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 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é et Fé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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 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 (é)
* 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) é 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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 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 à • œ
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)
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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 ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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 : é, à 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.
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é et Féret dans le groupe (FIFA)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
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....)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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 é
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 ?
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>
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++;
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>';
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
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 ;
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 30 nov. 2008 à 14:28
Ceci dit, tu fais 2 fois htmlentities() sur certains textes. Or, "&" se transforme alors en "&".
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.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 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.
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....