Probleme affichage & h e l l i p ; en utf-8
Résolu
Bob-In
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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 !
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:
- Hellip
- Clé windows 8 - Guide
- Mixcraft 8 - Télécharger - Création musicale
- É majuscule - Guide
- I o on off ✓ - Forum Loisirs / Divertissements
- I trema ✓ - Forum Clavier
12 réponses
Bonjour
Il suffit de mettre
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
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
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.
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.
Bonsoir
Si j'ai bien compris :
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.
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.
Heliotte, voilà ce qui me permet d'obtenir mes infos :
(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 !)
$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 !)
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 :
et aussi un petit print_r($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']);
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);"
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);"
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.
Mais dans un premier temps, afficher les codes comme je le demande ici donnera déjà une bonne indication de ce qui se passe.
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 !
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 !
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 ..
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 ..
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 !!
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 !!
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>
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 ! :)
J'essaye cet après midi, en espérant que tout se passera bien !!
Et encore merci pour votre aide ! :)
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
Merci encore ! Et bon nouvel an ! :)
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 ! :)
__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.
Il est un fait que j'ignorais cette procédure.