Probleme affichage & h e l l i p ; en utf-8

Résolu/Fermé
Bob-In Messages postés 8 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 30 décembre 2012 - Modifié par Bob-In le 7/12/2012 à 15:35
 Utilisateur anonyme - 30 déc. 2012 à 19:11
Bonjour

Je développe actuellement un site qui récupère des infos sur le site d'allociné via leur API (version 2.1.1).
Tout va bien, je suis aux anges, tout fonctionne, mis à part pour le caractère & h e l l i p ; (les 3 petits points). A la place, j'ai un "?" (pas celui encadré, comme pour un problème utf-8/iso, un "?" tout simple).


Dans le code :

$donnees = $helper->$type($code, $profile, $url); me permet de créer un array contenant les données du film au $code correspondant.
un print_r de $donnees m'affiche donc toutes les infos, et les & h e l l i p ; s'affichent comme il faut. Mais dès que je passe une info dans une variable (par ex : $synopsis=$donnees['synopsis']), à partir de là, j'ai les "?" UNIQUEMENT pour les & h e l l i p ; (les accents, tout le reste s'affiche correctement)

J'ai tout essayé, htmlentities(), utf-8_decode(), htmlspecialchars(), regex et j'en passe...

Je n'ai plus d'idée, aidez moi à sauver mon noël !!!

merci d'avance !
A voir également:

12 réponses

Bonjour

Il suffit de mettre
    define( 'ALLO_UTF8_DECODE', false );
(ligne 79 dans AlloCineAPI.php) au lieu de true et de retirer tous tes utf8_encode et ça marche.

Actuellement, tu reçois des données en utf-8. Elles sont (mal) traduites en iso8859-1 par la fonction utf8_decode de la classe AlloData, elle-même appelée par la fonction magique __get de cette même classe. Puis, pour afficher, tu re-transformes en utf-8.
D'une part, c'est absurde de transformer de l'utf8 en iso8859-1 pour le repasser aussitôt en utf8
D'autre part, ça va forcément mal se passer car certains caractères, comme le ... n'existent tout simplement pas en iso8859-1, donc la traduction n'est pas possible. On peut au mieux le remplacer par autre chose, comme le fait la fonction utf8_decode, mais elle ne le fait que pour deux ou trois caractères, elle n'a pas été écrite par quelqu'un de sérieux.
Le plus simple est donc de ne pas toucher au codage d'origine, en mettant ALLO_UTF8_DECODE à false
1
Utilisateur anonyme
30 déc. 2012 à 04:33
J'ajoute cette précision pour aider à comprendre : contrairement à ce que tu écris, $donnees n'est pas un simple tableau, mais un objet de la classe AlloData. La methode magique __get est appelée chaque fois que $donnees est evalué, donc par exemple quand tu fais $synopsis = utf8_encode($donnees['synopsis']);
__get à son tour appelle utf8_decode (définie dans la classe AlloData)
utf8_decode fait un str_replace farfelu (il faudrait un mb_str_replace), puis appelle utf8_decode (celui de PHP, pas celui de la classe AlloData cette fois... Faut suivre !)
Dans ton cas précis, c'est ce dernier appel qui transforme le caractère … initialement codé correctement E2 80 A6 comme il se doit en utf8, en un simple point d'interrogation.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
30 déc. 2012 à 12:26
Merci le père pour toutes ces précisions.
Il est un fait que j'ignorais cette procédure.
0
Utilisateur anonyme
30 déc. 2012 à 12:33
Moi aussi, jusqu'à cette nuit.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 7/12/2012 à 18:13
tu dis "& h e l l i p ;" - "les trois points"
je ne comprends pas, c'est après l'acquisition de la page, la conversion ?
As-tu tenté une conversion utf-8 à partir d'un Unicode ou d'un utf-7 ? ou le contraire ?
Tu peux mettre ton code sur cjoint.com pour qu'on puisse le voir .. enlever tout ce qui est confidentiel et surligner ou en couleur le code d'acquisition de la page, notamment l'endroit ou tu récupère ce fameux "& h e l l i p ;"
Edit: fautes d'orthographe.
0
Utilisateur anonyme
7 déc. 2012 à 18:42
Bonsoir


Si j'ai bien compris :
print_r($donnees);
$synopsis=$donnees['synopsis'];
print_r($synopsis;

t'affiche le ... correctement la 1ère fois, pas la deuxième ? Ça m'étonne beaucoup.
Quand tu compares l'affichage du print_r (qui marche) avec l'autre affichage(qui ne marche pas), s'agit-il de la même police de caractères ? Il se peut que le caractère ... soit absent d'une des polices.
0
Bob-In Messages postés 8 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 30 décembre 2012
Modifié par Bob-In le 8/12/2012 à 00:35
Heliotte, voilà ce qui me permet d'obtenir mes infos :

$donnees = $helper->$type($code, $profile, $url); //je charge les donnees dans la variable  
$synopsis = $donnees['synopsis'] //je récupère la valeur de la case 'synopsis' du tableau $donnees  
print_r($donnees); //no problemo, la partie du synopsis affiche les '...' correctement  
print_r($synopsis); //les '...' sont remplacés par des '?'

(si besoin, je mettrai mon code sur cjoint, là j'ai voulu aller vite ^^)

Et 'le père', bien vu pour l'idée du caractère absent, mais le problème persiste avec du Times New Roman, de l'Arial, ou du Serif.

(merci pour vos idées en tt cas !)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pourrais-tu faire un vrai copier-coller de ton code ? Celui que tu as donné est inexact, il manque un ; à la ligne $synopsis = $donnees['synopsis']
Moyennant cette correction, j'ai essayé ce code et il marche très bien.
Pour être bien sûr du contenu des variables, affiche leurs codes :
for ($k=0;$k<strlen($synopsis);$k++) echo ord($synopsis[$k]),' ';  
echo '<br>';  
for ($k=0;$k<strlen( $donnees['synopsis']);$k++) echo ord( $donnees['synopsis'][$k]),' ';  

et aussi un petit print_r($donnees['synopsis']);
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
8 déc. 2012 à 08:21
Bonjour Bob-In,
Je suis d'accord avec "le pére" pour ce qui est de montrer ton code en entier, mais peut-être, si le fichier est trop long, le déposer sur un site comme "http://www.cjoint.com/".
On aura plus de chance découvrir une anomalie.
Essaye de mettre en gras ou tout au moins quelque chose à l'affichage qui nous montrent de visu les endroits où se trouvent "print_r($donnees);" et "print_r($synopsis);"
0
Utilisateur anonyme
8 déc. 2012 à 09:30
Je n'ai pas demandé le code en entier, j'ai juste demandé que ce qui était recopié le soit sans erreur de recopie. Mais c'est sûr qu'en avoir un peu plus long ne pourra qu'aider à comprendre.
Mais dans un premier temps, afficher les codes comme je le demande ici donnera déjà une bonne indication de ce qui se passe.
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
8 déc. 2012 à 17:15
Milles excuses le père. Je me suis mal exprimé en disant cela, je voulait dire que j'étais d'accord pour la partie de code, mais que, perso, j'aurais préféré plus, c'est à dire, le code complet.
J'ai voulu aller trop vite dans ma requête
                                     \\|//
                                     {0;0}
0
Bob-In Messages postés 8 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 30 décembre 2012
Modifié par Bob-In le 29/12/2012 à 22:24
Bonsoir tout le monde, un grand désolé pour le retard, mais la période des fetes m'a bien pris ! J'espère que vous avez tous passé un bon noël et êtes en train de planifier votre nouvel an.

Pour ma part, je vous ai préparé un fichier zip qui comprend le code mis en forme pour vous aider à comprendre mon problème.

Je l'ai hébergé ici : http://www.terafiles.net/v-175801.html

Tout se trouve dans le fichier indes.php (par contre pour le faire fonctionner, vous devez l'ouvrir en localhost, avec WAMP ou MAMP). J'espère que cela pourra vous aider à y voir plus clair.

(désolé pour les erreurs dans l'ancien code, je ferais plus attention la prochaine fois ;)

Bon nouvel an à tous !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 29/12/2012 à 23:39
Bonsoir Bob-In,

J'espère que tu as également passé un bon Noël ..

Pour les trois points, je ne sait pas encore où est le problème, mais le "?" se trouve déjà dans la variable $synopsis !!

Edit:
J'ai fait plusieurs test sur cette variable ..
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 29/12/2012 à 23:48
Bob-In,

Pire .. c'est déjà dans la variable où tu récupère les infos .. $donnees['synopsis']

Edit:
Donc, avant n'importe quelle conversion que tu apportes .. c'est déjà dedans.
On ne peut même pas travailler sur le caractère "?" car ce caractère est interprété à l'identique du point d'interrogation d'un phrase .. interrogative !!
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
29 déc. 2012 à 23:50
Le code de test:
<p id="synopsis">
	<?php
		echo "======================<br />";
		for ($i = 1 ; $i < strlen($synopsis); ++$i) {
			if($synopsis[$i]=="?")
			{
				echo "...";
			}
			else
			{
				echo $synopsis[$i];
			}
		}
		echo "======================<br />";
		for ($i = 1 ; $i < strlen($donnees['synopsis']); ++$i) {
			echo $donnees['synopsis'][$i];
		}
		echo "======================<br />";
	?></p>
0
Bob-In Messages postés 8 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 30 décembre 2012
30 déc. 2012 à 16:01
Un grand merci à le père, je n'ai pas encore essayé la solution, mais j'ai déjà mieux compris la facon dont je récupère et utilise les données d'Allociné :)
J'essaye cet après midi, en espérant que tout se passera bien !!

Et encore merci pour votre aide ! :)
0
Bob-In Messages postés 8 Date d'inscription vendredi 7 décembre 2012 Statut Membre Dernière intervention 30 décembre 2012
30 déc. 2012 à 16:42
Le père, je CRYOGÉNIE !! (cire au génie)
Tout fonctionne, j'ai supprimé tous les "utf8_encode", et tout s'affiche à merveille. Cela venait donc bien de l'API en elle-même, je n'aurais jamais trouvé.

Pour ceux qui cherchent à l'avenir, il faut donc mettre
define( 'ALLO_UTF8_DECODE', false );
à la ligne 79, dans l'API d'allociné, et tout ira pour le mieux.

Merci encore ! Et bon nouvel an ! :)
0
Utilisateur anonyme
30 déc. 2012 à 19:11
De rien. Moi aussi j'ai appris des choses en essayant de comprendre ce qui se passait.

Bon nouvel an à tous.
0