2009-05-04 5 views
3

J'ai un problème avec un flux rss.problème avec flux RSS et cdata

Quand je fais <title>This is a title </title>

Le titre apparaît bien dans l'alimentation

Mais quand je DDO $ title = "Ceci est un tilte";

<title><![CDATA['$title']]></title> 

Le titre n'apparaît pas du tout.


Cela ne fonctionne toujours pas. Je produis mon dynamicly flux rss et il ressemble à ceci:

$item_template=" 
     <item> 
     <title>[[title]]</title> 
     <link>[[link]]</link> 
     <description><![CDATA[[[description]]]]></description> 
     <pubDate>[[date]]</pubDate> 
     </item> 
     "; 

et dans une boucle:

$s.=str_replace(
array("[[title]]","[[link]]","[[description]]","[[date]]"), 
array(htmlentities($row["title"]),$url,$description,$date), 
$item_template); 

Le problème est précisément lorsque le titre a un signe euro. Ensuite, il apparaît dans mon flux validateur comme:

Â\x80 

Des informations plus détaillées:

Ok je suis struggeling avec cela pour les derniers jours et je ne peux pas trouver une solution . Donc, je vais commencer une prime. Voici plus d'informations:

  • Les informations qui va dans l'alimentation est stockée dans une base de données 1 latin (qui j'administre)
  • Le problème apparaît quand il y a un signe euro dans la base de données. Peu importe wether € ou son comme &euro;
  • Le signe euro apparaît parfois comme charachters étranges ou comme  \ x80
  • je tente de résoudre le problème sur le côté alimentation pas du côté du lecteur.
  • Le code complet peut être trouvé ici: codedump
  • Suivant: parfois, lorsque le signe euro ne peut pas être analysé, l'élément (le titre ou la description) est affiché vide. Donc, si vous regardez dans la source lors de l'affichage du flux dans un navigateur, vous trouverez

Si vous avez besoin de plus d'informations, n'hésitez pas à demander.

+0

A propos, ne mélangez pas anglais et allemand. "datum" semble cool, mais c'est le singulier des données. Vous cherchez "date". Salutations de Münster (Westf.) – phihag

+0

Pouvez-vous nous donner la valeur exacte de la valeur de la base de données (comme dans base64_encode ($ row ["title"])?) Pourquoi pensez-vous que cette valeur contient un signe Euro? (C'est-à-dire comment est-ce que vous l'avez entré, est-ce que cela apparaît comme "€" ailleurs?) – phihag

Répondre

15

Le problème est votre code de sortie; changer

echo '<title><![CDATA[$title]]></title>'; 

à

echo '<title><![CDATA[' . $title . ']]></title>'; 

Comme une note de côté, s'il vous plaît l'esprit les éléments suivants: Ne pas répondre à votre question avec un suivi, mais modifier l'original. N'utilisez pas d'expressions rationnelles sans raison valable. Ne devine pas.

Au lieu de cela, faites ce que vous auriez dû faire tout le long: Enroulez le titre dans htmlentitites et être fait, comme dans:

echo '<title>' . htmlentities($title, ENT_NOQUOTES, [encoding]) . '</title>'; 

Replace [encoding] avec le codage de caractères que vous utilisez. Très probablement, c'est 'UTF-8'. Ceci est nécessaire car php (< 6) utilise ISO-8859-1 par défaut et il n'y a aucun moyen d'exprimer par ex. l'Euro signe dans cet encodage. Pour plus d'informations, veuillez vous référer au well-written introduction.

Je vous suggère également read about XML. Commencez avec le deuxième chapitre.

+1

J'ai supprimé mes followups et édite mon post de départ. – sanders

+0

Je peux toujours voir votre réponse, mais merci pour l'effort. Je suis désolé, mais ma réponse était incomplète et j'aurais dû voir ça tout de suite. Vous devez également spécifier un codage de caractères. Edited la réponse. – phihag

+0

Eh bien, encore des problèmes avec le signe de l'euro. $ s.= Str_replace ( \t \t \t \t \t \t \t \t tableau \t ("[titre []]", "[[link]]", "[[description]]", "[[donnée]]"), \t \t \t \t \t \t \t \t tableau \t (htmlentities (ligne de $ [ "titre"], ENT_NOQUOTES, "UTF-8", false), $ url, $ description, référence de $), \t \t \t \t \t \t \t \t \t $ item_template); \t \t \t \t \t \t Ceci donne un titre vide. – sanders

1

Quel langage de programmation ou environnement utilisez-vous? Par exemple, en PHP, les guillemets simples empêchent d'évaluer les variables à l'intérieur.

Dans le cas contraire, vous n'avez pas vraiment besoin de ces guillemets. Peut être vous avez été confondu par la syntaxe de tableau de PHP.

Alors vous feriez mieux écrire:

<title><![CDATA[$title]]></title> 
-1

Je crois que RSS Profil ne le permet pas: this document indique que title détient, les données de caractère qui est en outre défini as follows.

-1

This article peut être utile pour des informations sur le signe euro et le support dans divers contextes. Certaines des suggestions de cet article comprennent l'utilisation &#8364; ou &euro; ou simplement en remplaçant le signe avec le mot "euro". Bonne chance!

3

Utilisez htmlspecialchars() au lieu de htmlentities(). Les flux RSS/ATOM ne sont pas HTML, vous ne pouvez donc pas utiliser d'entités HTML. XML has only five entities defined by default, donc vous ne pouvez pas utiliser &euro;. Puisque vous utilisez UTF - utilisez le signe euro littéral, sans conversion (htmlentities), mais avec d'autres caractères sensibles (htmlspecialchars).

Et ce serait complètement valide RSS/XML. Si cela ne résout pas le problème, cela signifie qu'il se trouve ailleurs (veuillez me fournir la source brute du RSS pour plus d'aide).

0

Je ne comprends pas pourquoi vous devriez utiliser une fonction d'encodage. Quand un tiers prend votre contenu, il n'y aura aucune idée de comment décoder cette chaîne. Je pense que - vous devriez utiliser CDATA pour les balises qui peuvent casser de XML - utiliser des bibliothèques bien définies pour écrire XML. Pour PHP: DomDocument ou XML Writer (http://php.net/manual/fr/book.xmlwriter.php)