Accueil > Forum > > > > Comportement bizar des accentuations
Comportement bizar des accentuations
dimanche 30 novembre 2008 à 09:40:24 |
Comportement bizar des accentuations

slhuilli
|
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). '<a href='.htmlentities($lien).'><b>'.htmlentities($titre).'</b></a> <br /> '.htmlentities($txt).' </li>';
puis un peu plus loins
$headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; mail('mon_email_a_moi@gmail.com', 'Informations sur ...', $p, $headers);
me sort des trucs farfelus dans la mesure où parfois l'encodage est bon, parfois pas. La chaine en entrée est directement issus de différents flux RSS (d'où je pense l'explication pourquoi des fois ca marche et des fois pas). Toutes ces chaines sont stockées, avant d'etre envoytée, dans une base de données MySQL, dont l'interclassement de la tables est latin1_swedish_ci. A l'issu du traitement que j'ai collé ci-dessus, j'envoie un mail HTML avec le contenu que j'ai stocké dans ma base. Et c'est là que je ne comprends pas. Parfois le codage des accents est bon, parfois les accents sont envoyés en "HTML texte brut" (contenus sous le titre) parfois "encodé texte brut" (titre). Voici un exemple de ce que je recois : 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
|
|
dimanche 30 novembre 2008 à 10:04:14 |
Re : Comportement bizar des accentuations

yopai_v
|
Réponse acceptée !
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.
|
|
dimanche 30 novembre 2008 à 10:27:28 |
Re : Comportement bizar des accentuations

slhuilli
|
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 ?
|
|
dimanche 30 novembre 2008 à 11:08:03 |
Re : Comportement bizar des accentuations

yopai_v
|
Réponse acceptée !
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)
|
|
dimanche 30 novembre 2008 à 11:49:40 |
Re : Comportement bizar des accentuations

malalam
|
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.
|
|
dimanche 30 novembre 2008 à 11:54:48 |
Re : Comportement bizar des accentuations

slhuilli
|
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.='<ul>'; $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). '<a href='.htmlentities($lien).'><b>'.htmlentities($titre).'</b></a> <br /> '.htmlentities($txt).' </li>'; $sql = "insert into rss_item(titre,lien,description) values ('$titre','$lien','$description')"; sql_exec($sql); } $tout.='</ul>'; $position = strstr($tout,'<img src'); return $tout; }
$p=""; include("connexion.php"); include("toolbox/sql_exec.php"); include("connexion.php"); $sql = "select url_flux from rss_flux_a_lire"; $id = mysql_query($sql,$res); $p=""; $row=0; while (mysql_fetch_row($id)) { $canal = mysql_result($id,$row,0);
$temp=lire_rss($canal,"connexion.php"); // <= LA CONCATENATION DE FLUX MARCHE if (iconv_get_encoding($temp) == "UTF-8") { $temp = utf8_decode($temp); } if (iconv_get_encoding($temp,"ISO-8859-1") <> false) { $temp = utf8_decode($temp); }
$p = $p.$temp; $row++; }
$p=html_entity_decode($p); $p=SuppAccents($p);
Echo "Renseigements de la base terminés"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; mail('sebastien.lhuillier@gmail.com', 'Informations RSS sur Nancy', $p, $headers); Echo "Le mail d'alerte a bien été envoyé"; ?>et voici le résultat de mon mail : *quelqu'un peut il m'expliquer pourquoi ma marche dans le contenu et pas dans les liens ???
|
|
dimanche 30 novembre 2008 à 12:12:56 |
Re : Comportement bizar des accentuations

malalam
|
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.
|
|
dimanche 30 novembre 2008 à 13:20:16 |
Re : Comportement bizar des accentuations

slhuilli
|
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
|
|
dimanche 30 novembre 2008 à 13:25:05 |
Re : Comportement bizar des accentuations

malalam
|
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 ?
|
|
dimanche 30 novembre 2008 à 14:01:15 |
Re : Comportement bizar des accentuations

slhuilli
|
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 ?
|
|
Cette discussion est classée dans : titre, headers, description, parfois, htmlentities
Répondre à ce message
Sujets en rapport avec ce message
Lecture de Vidéo [ par bbmaster ]
Bonjour, Je suis actuellement en train de construire mon site de mon équipe de jeux vidéo et je voudrais y inséré un script qui afficherai un tableau
prob de MySQL [ par skaterboss2000 ]
Bonjour @ tous !-Voila ma source :echo"";include('connexion.php');//affichage de la dernière source$select=mysql_query("SELECT * FROM php") or die (my
Tri sur la meme table [ par LaurentKOogar ]
Bonjour, Vooila mon ptit probleme:Je dois faire un tri sur une table:Changer le 'titre' en fonction de la 'description' dans le meme enregistrement En
Requete moteur de recherche [ par vince1415 ]
Salut, Voila en fait j'ai un petit probléme avec ma requéte pour un moteur de recherche tout simple. Voici le code: function Search ($search, &$_
downloader en php [ par aamsa ]
Bonjour, j'ai créé une base de données qui stock les in formations de fichier uploader, j'aimerais que l'utilisateur download ces fichier et je ne sai
Formulaire PHP, reponse dans une autre page... [ par sebarca ]
Bonjour, à tous, je pense que c'est mon premier post sur le forum malgré de nombreuses années de recherche sur celui-ci. Aujourd'hui je post un messag
Warning: mail(): SMTP [ par spike911 ]
Bonjour tout le monde, J'ai un problème avec la configuration d'easy PHP... j'ai trouvé un petit code source que me permet d'envoyer un email via une
Requête PHP sous MySql : Créer une liste en résultat [ par Elpmi ]
Bonjour à tous ! Je crée un petit moteur de recherche d'artistes. J'ai une base données où je veux récupérer sous forme de liste, le nombre d'artiste
envoi de mail avec mail() [ par Oumbra ]
Bonjour, Mon problème est simple : Je veux envoyer un mail après la validation d'un formulaire, tout fonctionne parfaitement sauf que mon serveur n'a
Ou est le probleme ? [ par remitete ]
Bonjour ! j'ai dans une Bdd une base du nom de sharkemu une table du nom : news et 3 champs "id" ( int(11) auto increment ) "Titre" (varchar(50) ) "Me
Livres en rapport
|
Derniers Blogs
[WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7[WP7] UTILISER UN WRAPPANEL DANS UNE APPLICATION WINDOWS PHONE 7 par Audrey
Lors de la réalisation de ma 2ème application Windows Phone 7, j'ai souhaité utiliser un WrapPanel pour afficher plusieurs photos. Mais le contrôle WrapPanel ne fait pas parti de la liste des contrôles inclus dans le SDK de la version Beta des outils pour...
Cliquez pour lire la suite de l'article par Audrey [WP7] BESOIN D'AVOIR DES DONNéES EN CACHE[WP7] BESOIN D'AVOIR DES DONNéES EN CACHE par Nicolas
Les développeurs ASP.NET ont l'habitude de mettre des données en cache pour éviter de requêter a chaque fois la base de données. Et il est toujours utilie de penser que vos utilisateurs mobiles n'ont pas troujours une super connexion 3G/WIFI et un for...
Cliquez pour lire la suite de l'article par Nicolas [TFS] COMMENT FORCER LA SAISIE D'UN AREA OU ITERATION[TFS] COMMENT FORCER LA SAISIE D'UN AREA OU ITERATION par cyril
Lorsque l'on créé un Work Item dans TFS, il est possible de le classer dans un "area" et dans une "iteration". Dans la plupart des types de projet, un "area" correspond à une catégorie, une "iteration" à un numéro de version. Il est possible de cré...
Cliquez pour lire la suite de l'article par cyril SQL : FONCTIONS D'AGRéGATION MIN/MAX ET VALEURS NULLSQL : FONCTIONS D'AGRéGATION MIN/MAX ET VALEURS NULL par coq
Les fonctions d'agrégation comme MIN et MAX ignorent les valeurs NULL présentes dans le jeu de données sur lequel porte leur calcul, d'où le fameux message d'avertissement : Warning: Null value is eliminated by an aggregate or other SET operation...
Cliquez pour lire la suite de l'article par coq VOTEZ POUR WARNYGOVOTEZ POUR WARNYGO par Nicolas
La vidéo du projet Warnygo est disponible sur facebook et attend vos votes ! Pour rappel: Warnygo est une application Windows Phone 7 qui permet d'alerter tous utilisateurs inscrits qui se trouve dans la zone où se passe l'...
Cliquez pour lire la suite de l'article par Nicolas
Logiciels
sDEVIS-FACTURES vlPRO (3.8.0)SDEVIS-FACTURES VLPRO (3.8.0)sDEVIS-FACTURES vlPRO a été mis au point pour permettre besoins des particuliers, créateurs, entr... Cliquez pour télécharger sDEVIS-FACTURES vlPRO LettresFaciles (5.6.0)LETTRESFACILES (5.6.0)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles MyPlanning 2010 (5.6.0)MYPLANNING 2010 (5.6.0)MyPlanning 2010 permet de créer des plannings sous la représentation de diagrammes. Plannings pré... Cliquez pour télécharger MyPlanning 2010 Emicsoft Mac DVD en iPad Convertisseur (3.1.16)EMICSOFT MAC DVD EN IPAD CONVERTISSEUR (3.1.16)Emicsoft Mac DVD en iPad Convertisseur, logiciel professionnel de convertir les fichiers DVD en i... Cliquez pour télécharger Emicsoft Mac DVD en iPad Convertisseur Emicsoft ipad ménager pour mac (3.1.08)EMICSOFT IPAD MéNAGER POUR MAC (3.1.08)Emicsoft ipad ménager pour mac est spécialement conçu pour les utilisateurs Mac pour copier des f... Cliquez pour télécharger Emicsoft ipad ménager pour mac
|