Bonjour à tous,

J'affiche sur mon site les 3 derniers articles de ma page Facebook mais parfois sur CERTAINS articles, le titre ne s'affiche pas bien (les accents s'affichent mal).

- J'ai bien spécifié en HTML + PHP que ma page est en UTF8.
- J'ai vérifié l'encodage du fichier librairie Facebook sur mon serveur, il est bien en UTF8.
- J'ai essayé avec la fonction utf8_decode(), ça résous les bugs d'accents de mon premier article mais ça m'affiche d'autres bugs d'accents dans le second alors qu'il n'y en avait pas avant - CF image ci-dessous

http://www.socratehk.com/demo/test-2.png

Je ne sais pas quoi faire d'autres. Avez-vous une solution ?
Modérateur
Bonjour,

Tu as forcément une différence d'encodage quelque part.

Simplement vérifier si la page dans laquelle s'affiche les textes est en utf8 ne suffit pas. Il faut aussi vérifier que la matière de base (les textes) sont au départ dans le bon encodage (le même pour tous les textes ?), et que les traitements qui s'ensuivent sont les bons (les mêmes pour tous les textes ?).

Les textes viennent-ils d'un fichier ou d'une base ? Les données dans les fichiers ou la base sont-elles en utf8 ou dans un autre encodage ? sont-elles toutes dans le même encodage ? Y-a-t-il un traitement intermédiaire de ces textes susceptibles de modifier l'encodage ? Est-il le même pour tous les textes ?

Le plus simple est bien sûr que tous les textes soient au même encodage et aient ensuite un traitement identique. Cependant, il n'est pas impossible d'avoir des textes dans des encodages différents au départ (là où ils sont stockés) si on fait le bon traitement ensuite. Mais évidemment, c'est plus délicat à réaliser.

EDIT : pour faire ton importation depuis facebook, tu fais comment exactement ?

Amicalement,
Modifié par parsimonhi (23 Jan 2016 - 13:03)
Merci pour ta reponse.
Et bien je n'ai pas de BDD sur ce site, c'est juste une boucle PHP qui recupere les derniers posts FCB via leur API. En verifiant les encodages, les 2 premiers articles sont bien en UTF-8 tous les deux :
$encodage = mb_check_encoding($title);


Voici mon code PHP:
<?php
		require_once '../inc/fcb/src/Facebook/autoload.php';
		require_once('../function/opengraph.php');

		$fb = new Facebook\Facebook([
			'app_id' => '***',
			'app_secret' => '***',
			'default_graph_version' => 'v2.5'
			]);
		$fb->setDefaultAccessToken('***');
		
		try {
			$response = $fb->get('/***/posts');
			$postsNode = $response->getDecodedBody();
		} catch(Facebook\Exceptions\FacebookResponseException $e) {
			// When Graph returns an error
			echo 'Graph returned an error: ' . $e->getMessage();
			exit;
		} catch(Facebook\Exceptions\FacebookSDKException $e) {
			// When validation fails or other local issues
			echo 'Facebook SDK returned an error: ' . $e->getMessage();
			exit;
		}
		// print_r(echo $postsNode['data'];)
		?>
<ul><?php
        for($i = 0; $i < 3; $i++)
        {
            $message 	= $postsNode['data'][$i]['message'];
            $date_fcb 	= $postsNode['data'][$i]['created_time'];
            $date_source = strtotime($date_fcb);
            $timestamp = date('Y-m-d', $date_source);
            
            $graph = OpenGraph::fetch( $message );
            $message = explode("http", $message);
			$title = $graph->title;
			$encodage = mb_check_encoding($title);
            ?>
            <li>
            	<?php
				// Check if link
				if (isset($message[1]) || strpos($message[1], 'http') !== false)
				{ ?>
					<div class="boxes_previews">
                        <p class="title"><b><?php echo $encodage.'-'.$title; ?></b></p>
                        <?php
						if(is_object($graph))
						{
							$image = $graph->image;
							if($image == '') { $image = 'img/defaut.jpg'; } ?>
							<img class="previews" src="<?php echo $image; ?>" alt="Socrate's image facebook" width="180" />
							<?php
						}
						?>
						<?php //echo $message[0]; ?>
                        <!--
						<a href="<?php echo 'http'.$message[1]; ?>" target="_blank" class="message link_messages"><?php echo 'http'.$message[1]; ?></a>-->
					</div>
                    <?php
				}
				else
				{
					?>
                	<p class="message" style="color:white;"><?php $message[0]; ?></p>
					<?php
				}
				?>
                <p class="date"><?php echo $date; ?></p>
                <p class="lien"><a href="https://facebook.com/<?php echo $postsNode['data'][$i]['id'] ?>" target="_blank"><?= _ACTU_READ_MORE ?></a></p>
            </li>
            <?php
		} ?>
        </ul>
Modérateur
Bonjour,

Tu utilises mb_check_encoding() sur $titre. Ce $titre contient-il des caractères avec signes diacritiques (les accents, cédilles, ...) ? S'il n'en contient pas, mb_check_encoding() peut te répondre, ok, c'est de l'utf8 même si ce n'est pas le cas, puisque l'encodage en utf8 va être identique à de nombreux autres encodages.

Pour que ton mb_check_encoding() puisse voir quelque chose d'intéressant, il faut l'essayer sur une chaîne de caractère avec signes diacritiques.

EDIT : Il faut aussi lui mettre en deuxième paramètre 'utf-8' au cas où ton mb_internal_encoding ne serait pas utf-8.
EDIT : Je viens de faire quelques tests. Je pense qu'il y a trop de cas où mb_check_encoding() va te répondre ok alors que ce n'est pas le cas.

Amicalement,
Modifié par parsimonhi (23 Jan 2016 - 14:55)
Merci pour ton aide.
L'affichage de la ligne suivante me reponds 1, donc true, donc ils sont bien en UTF-8. Tres etrange..
$encodage = mb_check_encoding($title, 'UTF-8');


As-tu une autre suggestion ?
Modérateur
Bonjour,

On ne peut pas se fier à mb_check_encoding(). Ca dépend trop du contexte et de l'erreur qui cause le mauvais affichage.

Question 1 : as-tu fait les deux tests initiaux que tu montres dans ta question initiale sur le même serveur ?

Question 2 : je suis allé voir http://www.socratehk.com/demo/#actu. Le mauvais affichage a lieu à la fois sur l'actu 1 et l'actu 2. Tu as changé quelque chose ?

Amicalement,
Bonjour,

Oui les tests que j'ai fais ont ete fait en local. Le resultat en ligne maintenant contient les erreurs d'encodage dans les 2 premiers articles, pourtant je n'ai rien change. J'ai toujours :
$title = $graph->title;


Je ne sais plus quoi faire Smiley decu
Modérateur
Bonjour,

Sur la version en ligne, un utf8_decode($graph->title) systématique devrait suffire il me semble.

Amicalement,
Bonjour parsimonhi,
Eh bien ecoute, oui, la fonction a resolu le probleme. Tres etrange tout ca, au tout debut ca enlevait l'erreur du premier article et m'encodait differemment le second.
M'enfin, du moment que le probleme est resolu.
Merci !
Modifié par fanny95 (01 Feb 2016 - 09:37)
Bon eh bien il semblerait que le problème soit de retour Smiley decu
Lien

Un nouveau problème d'encodage. Pourtant la fonction php est bien en place.
Cela le fait sur certains articles mais pas avec d'autres. Comment pourrais-je le résoudre ?
mathieu1004
Merci de ton aide.

Eh bien c'est ce que je pensais aussi, mais si je met la fonction utf8_encode cela bug encore plus..
J'ai ajoute cette ligne la avant d'afficher mon titre :
setlocale(LC_CTYPE, 'fr_FR.UTF-8');

Puis j'ai affiche cette ligne ci :
$title = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $title);

Mais rien n'y fait. C'est bizarre, sur ton site ils disent que les caracteres que j'ai proviennent du fait que l'encodage est en ISO et qu'ils l'affichent en UTF8. Ce qui est surement le cas. Mais je ne sais pas comment resoudre le probleme.
Modérateur
Bonjour,

Quand tu vois "meublée" avec un losange à la place du é, c'est qu'il y a eu un utf_decode en trop.

Il semble que parfois, tu as besoin d'un utf_decode(), et parfois non.

Es-tu bien sûr que dans ton code, il n'y ait rien qui fait que parfois, il y a deux fois un utf_decode() de fait sur le même texte ? (genre un bout de script dans lequel tu passes deux fois ?)

Pour tester, il faut que tu fasses des echo ... ou des print ... un peu partout, pour voir à quel moment exactement il y aurait une anomalie.

Il faut faire un print du texte dès que tu le récupères de facebook, puis un print après chaque appel à utf_decode().

Bien que je n'y crois pas trop, il serait possible que l'API facebook t'envoie parfois une chaine ayant besoin d'un utf_decode(), et parfois n'en ayant pas besoin. Il faudrait en être sûr (d'où les echo .. que je conseille précédemment).

Si on arrive à être sûr que c'est les API qui donnent le mauvais encodage, alors il faudra se pencher sur la manière dont on pourrait détecter ça. Mais ça ne sert à rien de le faire tant qu'on n'est pas sûr que c'est des API que vient le problème.

Amicalement,
Modifié par parsimonhi (02 Feb 2016 - 21:50)
Bonjour,
Je ne suis pas un spécialiste de PHP, mais ces problèmes d'encodage sont communs à pas mal de langages.
Si j'avais ce type de problème en Java ou C#, par exemple, il me semble qu'il faudrait vérifier deux choses :
Tout d'abord, voir si les chaînes alphanumériques reçues de Facebook ne sont pas précédées d'un BOM (Byte Order Mask) précisant le jeu de caractères utilisé (a priori, il ne paraît pas y en avoir, mais c'est toujours mieux de vérifier).
Le deuxième point consiste à vérifier si l'API d'accès aux données Facebook ne permet pas de spécifier en paramètre quel encodage on veut.
Pas sûr que tout ceci soit la bonne réponse, mais cela peut être utile de vérifier.
Modérateur
Bonjour,

@sepecat : on sait qu'il faut utiliser utf_decode() dans ce cas-ci, c'est une certitude. Le problème est surtout de vérifier si les API envoient toujours les données dans le même encodage quel qu'il soit

Pour l'instant, il y a un doute : soit les API n'envoient pas toujours les données dans le même encodage, soit il y a dans le code php de la page une erreur qui traine qui fait que les textes, après réception, ne sont pas traités de la même manière. Il faut déjà vérifier si c'est le deuxième point qui pose problème.

Amicalement,
parsimonhi a écrit :
Bonjour,

@sepecat : on sait qu'il faut utiliser utf_decode() dans ce cas-ci, c'est une certitude. Le problème est surtout de vérifier si les API envoient toujours les données dans le même encodage quel qu'il soit

Pour l'instant, il y a un doute : soit les API n'envoient pas toujours les données dans le même encodage, soit il y a dans le code php de la page une erreur qui traine qui fait que les textes, après réception, ne sont pas traités de la même manière. Il faut déjà vérifier si c'est le deuxième point qui pose problème.

Amicalement,

C'est bien ce qui me semblait et lever l'ambiguïté sur les API, problème le plus en amont, me paraît une priorité.
Je suppose qu'en PHP il est possible de faire une boucle de 100 ou plus itérations, allant chercher les données chez Facebook ou autres et testant le jeu de caractères des chaînes reçues (en mode "strict" car il me semble avoir vu une instruction PHP qui accepte un paramètre de ce type pour le test).
Si aucune erreur n'est constatée, vérifier le code de la page est la seconde étape.
En tout cas, après avoir jeté un oeil sous Fiddler (analyseur de trafic HTTP), le reste de la page semble correctement interprété en UTF-8. Le problème est bien circonscrit au bloc reçu d'une source externe.
Comme en Java, utiliser "décide" sur des données dont on n'est pas sûr du type ne peut rendre que des résultats aléatoires.
Ceci dit, PHP n'est pas encore mon domaine de jeu, pour l'instant...
Oups... C'est bien de l'instruction "décode" et non pas "decide" qu'il s'agit.
Gros doigts sur clavier de mobile égale coquilles en série.
Je suis d'accord avec eux pour dire qu'il faudrait réussir à toujours avoir le même type de données en entrée.
Je ne connais pas l'api facebook, mais ici https://developers.facebook.com/docs/graph-api/making-multiple-requests ils ont l'air de récupérer des charset ( toujours utf-8 sur les screens mais bon...). est ce que à défaut de pouvoir toujours avoir du utf-8 en entrée il t'es possible d'obtenir le charset de la page (et ainsi peut être parfois obtenir du iso 8859-1 ou autre) pour convertir facilement ?


Je dois être trop con mais je n' arrive toujours pas à comprendre pourquoi il faut faire du utf-8_decode au lieu du utf-8_encode...
Pour m’éclairer un peu, est ce que tu pourrais me dire ce qui s'affiche lorsque :
-tu n'encode/decode rien
-tu utf-8_decode les 2
-tu utf-8_encode les 2

Bon courage
Modifié par mathieu1004 (09 Feb 2016 - 21:29)