Pb flux RSS et encodage

WRInaute occasionnel
Bonsoir,

j'ai un problème avec l'encodage de mon flux Rss
http://www.good-luck-ecommerce.fr/flux.xml

Les tables de ma bdd est en utf general ci. Et le site n'a pas de problème que le flux. Si vous avez des idées.


ps : est-il possible de mettre sur un même flux des infos de différentes tables.
 
WRInaute accro
Sans savoir ce que tu utilises pour générer le flux, difficile de te dire où est le problème, mais ça a l'air assez sauvage. Je dirais que tu fais une conversion en ISO à un moment donné, et qu'ensuite tu le donnes à un bout de code (qui contient un htmlentities ou équivalent) qui veut de l'UTF-8 (et qui ne vérifie que dalle).

Jacques.
 
WRInaute discret
Ouvre ton fichier "flux.xml" avec un éditeur de code, puis vérifie :
- si le fichier est encodé en UTF-8
- si dans la source, il y a bien encoding="UTF-8" dans la balise "xml"
 
WRInaute occasionnel
webinyou a dit:
Ouvre ton fichier "flux.xml" avec un éditeur de code, puis vérifie :
- si le fichier est encodé en UTF-8
- si dans la source, il y a bien encoding="UTF-8" dans la balise "xml"

il y a rien :
Code:
<?xml version="1.0"?>
<rss version="2.0"><channel>

Mon fichier php qui génère le flux :
Code:
<?php

function &init_interview_rss(&$xml_file)
{
        $root = $xml_file->create_element("rss"); //création de l'element
        $root->set_attribute("version", "2.0"); //on lui ajoute un attribut
        $root = $xml_file->append_child($root); //on l'insère dans le noeud parent (ici root qui est "rss")
       
        $channel = $xml_file->create_element("channel");
        $channel = $root->append_child($channel);
               
        $desc = $xml_file->create_element("description");
        $desc = $channel->append_child($desc);
        $text_desc = $xml_file->create_text_node("Good Luck Ecommerce. Conseils pour e-commercant. Astuce e-commerce"); //on insère du texte entre les balies <description></description>
        $text_desc = $desc->append_child($text_desc);
       
        $link = $xml_file->create_element("link");
        $link = $channel->append_child($link);
        $text_link = $xml_file->create_text_node("http://www.good-luck-ecommerce.fr");
        $text_link = $link->append_child($text_link);
       
        $title = $xml_file->create_element("title");
        $title = $channel->append_child($title);
        $text_title = $xml_file->create_text_node("Good Luck Ecommerce. Conseils e-commerce");
        $text_title = $title->append_child($text_title);
       
        return $channel;
}
 
function add_interview_node(&$parent, $root, $id, $titre, $titreweb, $descriptif)
{
        $item = $parent->create_element("item");
        $item = $root->append_child($item);
       
        $title = $parent->create_element("title");
        $title = $item->append_child($title);
        $text_title = $parent->create_text_node($titre);
        $text_title = $title->append_child($text_title);
       
        $link = $parent->create_element("link");
        $link = $item->append_child($link);
        $text_link = $parent->create_text_node("http://www.good-luck-ecommerce.fr/interviews/interview-".$titreweb.".php");
        $text_link = $link->append_child($text_link);
       
        $desc = $parent->create_element("description");
        $desc = $item->append_child($desc);
        $text_desc = $parent->create_text_node($descriptif);
        $text_desc = $desc->append_child($text_desc);
             
        $author = $parent->create_element("author");
        $author = $item->append_child($author);
        $text_author = $parent->create_text_node("Good Luck Ecommerce");
        $text_author = $author->append_child($text_author);
       
        $pubdate = $parent->create_element("pubDate");
        $pubdate = $item->append_child($pubdate);
        $text_date = $parent->create_text_node($dateinterview);
        $text_date = $pubdate->append_child($text_date);
       
        $guid = $parent->create_element("guid");
        $guid = $item->append_child($guid);
        $text_guid = $parent->create_text_node("http://www.good-luck-ecommerce.fr/interviews/interview.php?page=".$titreweb."");
        $text_guid = $guid->append_child($text_guid);
       
        $src = $parent->create_element("source");
        $src = $item->append_child($src);
        $text_src = $parent->create_text_node("http://www.good-luck-ecommerce.fr");
        $text_src = $src->append_child($text_src);
}

 
function rebuild_rss()
{
        //On se connecte à la BDD
mysql_connect(XXXXXXXXXXXXXXXXXXX);
mysql_select_db("FFFFFFFFFFFFFFFFFFFFFF");
 
        //On récupère les interview
        $nws = mysql_query("SELECT id, titre, titreweb, descriptif FROM interview ORDER BY id DESC")  or die(mysql_error());

 
        //On crée le fichier XML
$xml_file = domxml_new_doc("1.0");

        //On initialise le fichier XML pour le flux RSS
        $channel = init_interview_rss($xml_file);
 
        //On ajoute chaque interview au fichier RSS
        while($interview = mysql_fetch_assoc($nws))
        {
                add_interview_node($xml_file, $channel, $interview["id"], $interview["titre"], $interview["titreweb"], $interview["descriptif"], $interview["dateinterview"]);
        }
       
        //On écrit le fichier
$xml_file->dump_file("flux.xml");
}
?>

<?php
rebuild_rss();
?>
 
WRInaute accro
Tu es sûr que ta base est bien en UTF-8 et la connexion à ta base aussi? Mon petit doigt me dit que ce n'est pas le cas, et que ta base est en ISO-8859-1, et c'est donc normal que ça déconne, les fonction domxml veulent de l'UTF-8.

Ajoute un utf8_encode() autour des champs que tu récupères de ta BDD avant de les passer à add_inverview_node, ça devrait beaucoup mieux fonctionner.

Jacques.
 
WRInaute occasionnel
Je ne suis sûr de rien.

Phpmyadmin me dit : interclassement connexion mysql utf8 general ci.
Les tables utf8
Les pages de mon site sont en iso (ça marche bien)


D'après ce que j'ai compris de ce que tu me dis, j'ai fais ça :
utf8_encode($nws = mysql_query("SELECT id, titre, titreweb, descriptif FROM interview ORDER BY id DESC")) or die(mysql_error());

Ca change pas. :?
C'était ce que tu me disais où j'ai mal compris ?
 
WRInaute accro
Euh non, tu modifies:
add_interview_node($xml_file, $channel, $interview["id"], $interview["titre"], $interview["titreweb"], $interview["descriptif"], $interview["dateinterview"]);

et tu le remplaces par:
add_interview_node($xml_file, $channel, $interview["id"], utf8_encode($interview["titre"]), $interview["titreweb"], utf8_encode($interview["descriptif"]), $interview["dateinterview"]);

Jacques.
 
WRInaute discret
1. Renomme
Code:
<?xml version="1.0"?>
en
Code:
<?xml version="1.0" encoding="UTF-8"?>
.

2. Le fichier "flux.xml" doit être encodé en UTF-8, c'est au niveau de la structure du fichier. Pour cela assure-toi bien qu'avec ton éditeur, tu es bien sur un format UTF-8.
Par exemple, avec notepad++, va sur le menu "Format/Encoder en UTF-8 (sans BOM)".

3. La même chose pour le fichier source PHP qui génère le fichier "flux.xml"
 
WRInaute occasionnel
jcaron a dit:
Euh non, tu modifies:
add_interview_node($xml_file, $channel, $interview["id"], $interview["titre"], $interview["titreweb"], $interview["descriptif"], $interview["dateinterview"]);

et tu le remplaces par:
add_interview_node($xml_file, $channel, $interview["id"], utf8_encode($interview["titre"]), $interview["titreweb"], utf8_encode($interview["descriptif"]), $interview["dateinterview"]);

Jacques.

merci ça fonctionne !

merci à vous deux.
Si vous avez une idée pour mettre les flux rss des autres tables (articles et blog) ?
 
WRInaute accro
Ben c'est pareil, tu ajoutes des utf8_encode autour des champs qui contiennent du texte avec éventuellement des accents.

Jacques.
 
WRInaute accro
Ce serait probablement plus intelligent de faire des flux RSS séparés, non?

Sinon tu peux remplacer ton SELECT par un SELECT id,titre,titreweb,descriptif FROM interview UNION SELECT id,titre,titreweb,descriptif FROM articles UNION SELECT id,titre,titreweb,descriptif FROM blog par exemple. Il faut évidemment adapter les noms des champs, et il va falloir:
- passer des informations différentes pour construire les URLs qui vont bien en conséquence
- faire un tri global suivant un ordre à déterminer

Autre possibilité, tu fais le premier select avec la boucle qui fait des add_interview_node, puis un deuxième select avec une boucle qui fait des add_article_node (il faut créer cette fonction qui est comme l'autre à quelques détails près, en particulier l'URL), etc.

Jacques.
 
WRInaute occasionnel
Merci JC, tu es un dieu !

J'ai opté pour ta deuxième solution.
Pour ceux qui auront le même soucis que moi, voici mon bazar :

//On récupère les interview
utf8_encode($nws = mysql_query("SELECT id, titre, titreweb, descriptif, timestamp FROM interview ORDER BY timestamp DESC")) or die(mysql_error());

//On récupère les articles
utf8_encode($nws2 = mysql_query("SELECT id, titre, titreweb, descriptif, timestamp FROM article ORDER BY timestamp DESC")) or die(mysql_error());

//On récupère les portraits
utf8_encode($nws3 = mysql_query("SELECT id, interviewe, intervieweweb, descriptif, timestamp FROM portrait ORDER BY timestamp DESC")) or die(mysql_error());

//On récupère le blog
utf8_encode($nws4 = mysql_query("SELECT id, titre, titreweb, timestamp FROM blog ORDER BY timestamp DESC")) or die(mysql_error());


//On crée le fichier XML
$xml_file = domxml_new_doc("1.0");

//On initialise le fichier XML pour le flux RSS
$channel = init_interview_rss($xml_file);

//On ajoute chaque interview au fichier RSS
while($interview = mysql_fetch_assoc($nws))
{
add_interview_node($xml_file, $channel, $interview["id"], utf8_encode($interview["titre"]), $interview["titreweb"], utf8_encode($interview["descriptif"]), $interview["timestamp"]);
}

//On ajoute chaque article au fichier RSS
while($article = mysql_fetch_assoc($nws2))
{
add_article_node($xml_file, $channel, $article["id"], utf8_encode($article["titre"]), $article["titreweb"], utf8_encode($article["descriptif"]), $article["timestamp"]);
}

//On ajoute chaque article au fichier RSS
while($portrait = mysql_fetch_assoc($nws3))
{
add_portrait_node($xml_file, $channel, $portrait["id"], utf8_encode($portrait["interviewe"]), $portrait["intervieweweb"], utf8_encode($portrait["descriptif"]), $portrait["timestamp"]);
}

//On ajoute chaque article du blog au fichier RSS
while($blog = mysql_fetch_assoc($nws4))
{
add_blog_node($xml_file, $channel, $blog["id"], utf8_encode($blog["titre"]), $blog["titreweb"], utf8_encode($blog["descriptif"]), $blog["timestamp"]);
}
 
WRInaute accro
Le ut8_encode() autour de chaque mysql_query ça ne sert à rien, et en plus ça doit fausser la détection d'erreur.

Jacques.
 
Discussions similaires
Haut