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
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|