begin process at 2010 09 02 22:25:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Débutant(e)

 > 

Comportement bizar des accentuations


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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 :

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



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

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 à &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)

dimanche 30 novembre 2008 à 11:49:40 | Re : Comportement bizar des accentuations

malalam

Administrateur CodeS-SourceS
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.
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 :

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


*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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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 ?

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 ?

1 2 3

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


Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales