Salut à tous,

Je cherche à afficher différents flux rss au sein d'une même page.
Seulement, je ne connais pas l'encodage des uns et des autres.

Quelqu'un aurait une solution pour détecter l'encodage des flux ??
J'ai beau chercher, je ne trouve rien ...

il doit être possible de lire la première ligne du fichier xml et de la parser pour retrouver l'encodage non ? (mes lacunes en php ne permettent cependant pas de le faire ..hum ..)

Si quelqu'un a une idée, je suis preneur Smiley smile

Merci d'avance,

PH
Modifié par Pouchou (26 Jun 2006 - 21:04)
Pouchou a écrit :
il doit être possible de lire la première ligne du fichier xml et de la parser pour retrouver l'encodage non ? (mes lacunes en php ne permettent cependant pas de le faire ..hum ..)

Normalement oui. Et en l'absence d'encodage trouvé, considérer que c'est de l'UTF-8 (il me semble qu'en XML la mention de l'encodage n'est obligatoire que si le document n'est pas en UTF-8). Le principe a l'air bon. Ensuite, écrire le script qui va bien, c'est pas vraiment dans mes cordes… Smiley decu
Salut et merci pour ta réponse.

En fait, je viens de trouver une solution tordue, mais qui marche ...

Voici ce que je fais :

1°/ je parse le flux RSS (code source original)

function getMainRSS($fichier,$item,$champs) {
   // on lit le fichier
   if($chaine = @implode("",@file($fichier))) {
      // on explode sur l'item voulu
      $tmp = preg_split("/<\/?".$item.">/",$chaine);
      // pour chaque <item>
      for($i=1;$i<sizeof($tmp)-1;$i+=2)
         // on lit les champs demandés <champ>
         foreach($champs as $champ) {
            $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
            // on ajoute au tableau
            $tmp3[$i-1][] = @$tmp2[1];
         }
      // et on retourne le tableau
      return $tmp3;
   }
}


Ce code me permet de récupérer les champs que je veux extraits du flux RSS.

2°/ Ensuite, j'utilise la fonction
mb_detect_encoding($string)
qui me retourne le type d'encodage utilisé pour la chaîne analysée.
Elle peut ainsi me retourner ASCII, UTF-8, ....

3°/

if ($resultatAnalyse=="UTF-8") { 
	$monChamp= utf8_decode($monChamp);
} 


Par contre, certains flux (ex: celui de Les Echos) sont vus comme étant de l'UTF-8 par cette fonction alors que c'est de l'ISO Smiley decu

Si quelqu'un a une idée, elle est la bienvenue Smiley smile

@+
PH
Modifié par Pouchou (26 Jun 2006 - 20:09)
Bon aller cette fois c'est bon ...

Explications, ca peut servir :

0: j'ai décidé que tout se passerait en UTF-8
1: je parse mon flux RSS en obtient donc une chaine.
2: je détecte l'encodage de cette chaine
mb_detect_encoding($string)

3: Si ce n'est pas de l'UTF-8, je l'encode en UTF-8
utf8_encode($string) 

4: je nettoie cette chaine des éventuels résidus ou erreurs provenant de la source (accents, caractères spéciaux, balises HTML)
5: je décompose cette chaine pour obtenir un tableaux que je peux utiliser avec PHP

Et là, plus aucune erreur Smiley smile

En espérant que ca serve à quelqu'un !!

PH
Modifié par Pouchou (26 Jun 2006 - 21:06)
Bonsoir,

Je suis confronté au même problème que toi pour un truc que je croyais simple en faite cela est très complexe lol

tu pourrais me donner plus d'infos sur ton ponit 4 svp ?

Merci d'avance
Bonne soirée
Ludo
Salut lelectronique,
Ce qui me posait principalement problème c'était toutes les données CDATA dont je me fichais, donc j'ai procédé comme ca :

D'abord, une fonction pour nettoyer une chaine de ses caractères spéciaux gênants:

function clearRssString($string) {
	// Correction sur les &
	$string = str_replace("&", "&", $string);
	// Correction sur les < >
	$string = str_replace("<", "<", $string);
	$string = str_replace(">", ">", $string);
	return $string;
}

Ensuite, je peux parser le flux :

function parseRSS($fichier,$item,$champs) {
   // on lit le fichier
   if($chaine = @implode("",@file($fichier))) {
	   // Détection de l'encoding
		$encodingChaine=seems_utf8($chaine);
		//Nettoyage de la chaine
		$chaine= clearRssString($chaine);
		// Encodage si nécessaire
		if ($encodingChaine==false) {
			$chaine= utf8_encode($chaine);
		}
		// on explode sur l'item voulu
		$tmp = preg_split("/<\/?".$item.">/",$chaine);
		// pour chaque <item>
		for($i=1;$i<sizeof($tmp)-1;$i+=2)
		// on lit les champs demandés <champ>
			foreach($champs as $champ) {
				$tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
				// on ajoute au tableau
				$tmp3[$i-1][] = @$tmp2[1];
			}
			// et on retourne le tableau
			if (isset($tmp3)) {
				return $tmp3;
			}
	}
}

Ensuite, faut tout nettoyer pour ne conserver que les champs qui m'intéressent:

if ($xml=parseRSS ($xmlFeed,"item",array("title","link","pubDate","description"))) {
			foreach($xml as $row) {
				// Nettoyage des données additionnelles
				$stringMappingArray = array();
				// Suprresion des CDATA
				$stringMappingArray[ "<![CDATA[" ] = "";
				$stringMappingArray[ "]]>" ]       = "";
				$titleFeedPost = strtr( $row[0], $stringMappingArray );
				$descriptionFeedPost=strtr( $row[3], $stringMappingArray );
				// Suppression du code HTML
				$titleFeedPost = ereg_replace("<[^>]*>", "", $titleFeedPost);
				$descriptionFeedPost = ereg_replace("<[^>]*>", "", $descriptionFeedPost);
				if ($row[2]!="") {
					$xmlDate=date("Y/m/d h:i",strtotime($row[2]));
				} else {
					$xmlDate="";
				}
// Reste plus qu'à faire l'affichage et fermer le if

J'espère que ca pourra t'aider ... et désolé de ne pas expliquer bcp, j'ai fais ca il y a un moment maintenant et ne suis plus du tout dedans ...

Si d'autres ont de meilleures propositions à faire ... n'hésitez pas !
Smiley biggrin
Salut pouchu,

merci pour ton aide, ton code est beaucoup plus simple que le mien je me suis embarqué dans un truc trop compliqué moi Smiley decu

Pas contre à quoi correspond ta fonction seems_utf8() tu as utilisé mb_detect_encoding() ou non ?

merci pour ta réponse
bonne journée
A+
Ludo

PS : il y a t'il une fonction sur le forum pour etre prévenu d'une réponse ?
Oups, effectivement. La fonction mb_detect_encoding ne devait pas me donner les résultats escomptés (cf ISO vs UTF) donc j'avais trouvé cette fonction quelque part :


function seems_utf8($Str) {
	for ($i=0; $i<strlen($Str); $i++) {
		if (ord($Str[$i]) < 0x80) $n=0; # 0bbbbbbb
		elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
		elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
		elseif ((ord($Str[$i]) & 0xF0) == 0xF0) $n=3; # 1111bbbb
		else return false; # Does not match any model
		for ($j=0; $j<$n; $j++) { # n octets that match 10bbbbbb follow ?
			if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80)) return false;
		}
	}
	return true;
} 


Pour le forum, je reçois un mail à chaque fois que quelqu'un répond à un sujet où j'ai participé... mais c'est le seul sujet je crois où j'ai participé, alors je me souviens plus ... peut-être dans le profil ?
Bonsoir,

Désolé pour le retard Smiley decu je te remercis pour ton aide cela fonctionne impec sauf que j'ai des soucis avec certain flux lorsque le champ pubdate est pas renseigné ou mal cela m'insére plusieurs fois l'info mais je vais bien trouver une solution Smiley cligne
UN GRAND MERCI Smiley cligne
pour l'envoi de mail je n'ai rien trouvé dans le profil

bonne soirée
Ludo
Pour parer au problème de mb_detect_encoding($str) qui renvoie parfois UTF-8 alors que ce n'en est pas, j'ai utilisé
mb_detect_encoding($str, "auto", true)

le 2e paramètre correspond à une liste d'encodages (on s'en fout), le 3e détermine si la détection doit être stricte ou pas (par défaut à false)
cf la doc de Php, c'est là que j'ai trouvé ça, ça a résolu mon preoblème ^^