[RESOLU] Problème d'Encodage UTF8

Petit nouveau ! | 9 Messages

08 juin 2017, 22:19

Bonjour à tous
J'ouvre ce sujet (très classique je l'avoue) faute d'avoir pu résoudre mon souci.
Je gère de A à Z un site pour mon association. Jusqu'à présent tout se passait très bien jusqu'à ce que a ami qui hébergait notre site chez son hébergeur (il a un site marchand), décide de lancer un chantier de changement d'hébergeur. Le socle technique a évolué (machine et très probablement les composants logiciels, le HTML, le PHP etc...). Résultat : tous les caractères accentués stockés dans ma BDD (gérée sous PHPMYAdmin), sont restitués avec un problème d'encodage dans les différents navigateurs.
Tant qu'on ne pourra régler mon problème on ne pourra basculer sur le nouvel hébergeur. Sur l'actuel je n'ai aucun souci
Un exemple (ne tenez pas compte du fond/texte :)):
Une vingtaine de membres ont brav�s le brouillard pour d�guster le vin chaud de notre druide.
Toutes les pages que j'ai développé sont bien encodées en UTF8 (vérifié sous Notepad++).
Le transfert FTP de ces pages à été fait en binaire.
Il n'est pas exclu toutefois que le contenu (code HTML) de mes pages ne respectent pas les standard du HTML5 que je ne suis pas certain de maitriser.

Exemple :
Dans la BDD (table "message") j'ai :
<b>19/02/2017</b> : <p>
"Ravalement" en profondeur du site internet du club + changement de l'hébergement du site.

Résultat dans le navigateur :
19/02/2017 :

"Ravalement" en profondeur du site internet du club + changement de l'h�bergement du site.

La page concernée (vous pouvez vous focaliser sur le code situé au début et qui gère le SELECT à la BDD sur la table concernée "message" ==> $reponse = mysqli_query($connect,"SELECT * FROM message");

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>

<div id="corp">
	<?php
	include 'conf_inc.php';
	$connect = mysqli_connect($host,$login,$pass,$base);
	if (mysqli_connect_errno())
		{
		echo "Failed to connect to MySQL: " . mysqli_connect_error();
		exit();
		}?>
<table width="100%">
	<tr valign="top">
		<td>
			<table>
				<tr>
					<td bgcolor=#C1BA9D style="color:#645E5E"><?php
						$reponse = mysqli_query($connect,"SELECT * FROM message"); 
						while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
						{?>
							<marquee direction=up scrollamount=4>
							<?php echo $donnees['texte'];?></marquee><?php
						}?>
					</td>
				</tr>
				<tr>
					<td rowspan="3"><?php
/*
Principe de ce petit script : 
On charge dans un tableau les noms de fichiers présent dans le répertoire d'image 
mais en les prefixant par leur date de modification (avec un séparateur "@")
On trie ensuite ce tableau en ordre descendant afin de bénéficier des images les plus récentes
en premier.
Ensuite on dépile ce même tableau trié, mais en découpant la variable(date+nom de fichier) afin de ne 
conserver que le nom de fichier.
ex : planeurdeFrancis.JPG
On peut ainsi afficher via la balise <img> l'image en question en bouclant sur la table.
*/
						$arr = array();
						$folder = './img/Accueil/';							
						$fichier = scandir($folder);
						$i++;
						foreach ($fichier as $key => $value) 
						{
						  if ($value != '.' && $value != '..') 
						  {
							$chemcomplet = $folder.$value;
							$dat = date("YmdHis", filemtime($chemcomplet)); 
							$arr[$i] = $dat."@".$value; 
							$i++;
						  }
						}
						arsort($arr); 
/*						print_r($arr); */
						foreach ($arr as $nomfichier)
						{
						  if ($nomfichier != '.' && $nomfichier != '..') 
						  {
							$findme = "@";
							$pos = strpos($nomfichier, $findme);
							$rest = substr($nomfichier, $pos+1);?>
							<img style="z-index:0; width: 300px;" src="<?php echo $folder.'/'.$rest?>" ><?php
						  }
						}?>
					</td>
				</tr>
			</table>

		</td>
		<td  width="100%">

	   <table id="cadre" cellspacing="0" cellpadding="0">
		<tr>
			<td id="csg"></td>
			<td id="sup"></td>
			<td id="csd"></td>
		</tr>
	   <tr>
			<td id="gche"></td>
			<td id="ctre">
			
			<table border = "0" bgcolor="#C1BA9D" align=CENTER>
				<tr>
					
					<td width="13%" align=CENTER><?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '1'");
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC))
							{
							if (empty($donnees['url'])) 
								{?>
								 <font size=1><?php echo $donnees['info']; ?></font>							<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url'];?>" target="_blank"><img src=<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?> width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
					<td width="1%" bgcolor=#E2E1CD></td>
					<td width="13%" ALIGN=CENTER><?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '2'"); 
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
							{
							if (empty($donnees['url'])) 
								{
								?>
								<font size=1><?php echo $donnees['info']; ?></font>	<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url']; ?>" target="_blank"><img src="<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
					<td width="1%" bgcolor=#E2E1CD></td>
					<td width="13%" ALIGN=CENTER>
						 <?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '3'"); 
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
							{
							if (empty($donnees['url'])) 
								{
								?>
								<font size=1><?php echo $donnees['info']; ?></font>	
								<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url']; ?>" target="_blank"><img src="<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
					<td width="1%" bgcolor=#E2E1CD></td>
					<td width="13%" ALIGN=CENTER>
						 <?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '4'"); 
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
							{
							if (empty($donnees['url'])) 
								{
								?>
								<font size=1><?php echo $donnees['info']; ?></font>	
								<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url']; ?>" target="_blank"><img src="<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
					<td width="1%" bgcolor=#E2E1CD></td>
					<td width="13%" ALIGN=CENTER>
						 <?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '5'"); 
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
							{
							if (empty($donnees['url'])) 
								{
								?>
								<font size=1><?php echo $donnees['info']; ?></font>	
								<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url']; ?>" target="_blank"><img src="<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
					<td width="1%" bgcolor=#E2E1CD></td>
					<td width="13%" ALIGN=CENTER>
						 <?php
						   $reponse = mysqli_query($connect,"SELECT * FROM flash where id = '6'"); 
							while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
							{
							if (empty($donnees['url'])) 
								{
								?>
								<font size=1><?php echo $donnees['info']; ?></font>	
								<?php
								}
							else
								{
								?><b style='color: #645E5E'><?php echo $donnees['info']?></b>
								<a href="<?php echo $donnees['url']; ?>" target="_blank"><img src="<?php echo $donnees['repertoire'];?>/<?php echo $donnees['fichier'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>">
								<?php
								}
							}?>
					</td>
				</tr>





				</table>
			<td id="dte"></td>
		</tr>
		<tr>
			<td id="cig"></td>
			<td id="inf"></td>
			<td id="cid"></td>
		</tr>
	</table>


   <table id="cadre" cellspacing="0" cellpadding="0">
   <tr><td id="csg"></td><td id="sup"></td><td id="csd"></td></tr>
   <tr><td id="gche"></td><td id="ctre">
			<?php
			$reponse = mysqli_query($connect,"SELECT * FROM news order by date desc"); 
			while ($donnees = mysqli_fetch_array($reponse,MYSQLI_ASSOC) )
			{
			?>
			<h2><?php echo $donnees['date']; echo " : "; echo $donnees['titre'];?></h2>
			<font style="color: #645E5E; font-size: 1.2em;"><?php echo $donnees['news'];?></font><?php
/* Affichage d'une image dans la home page */
			if (empty($donnees['image1'])) 
				{
				}
				else
				{
			    ?><p><img src="<?php echo $donnees['repimg1'];?>/<?php echo $donnees['image1'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>"><?php
				}
/* Affichage d'une image dans la home page */
			if (empty($donnees['image2'])) 
				{
				}
				else
				{
			    echo "  "; ?><img src="<?php echo $donnees['repimg2'];?>/<?php echo $donnees['image2'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>"><?php
				}
/* Affichage d'une image dans la home page */
			if (empty($donnees['image3'])) 
				{
				}
				else
				{
			    echo "  "; ?><img src="<?php echo $donnees['repimg3'];?>/<?php echo $donnees['image3'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>"><?php
				}
/* Affichage d'une image cliquable */
			if (empty($donnees['imageclic'])) 
				{
				}
				else
				{
				?><a href="<?php echo $donnees['repfich1'];?>/<?php echo $donnees['fichier1'];?>" target="_blank"><img src="<?php echo $donnees['repimgclic'];?>/<?php echo $donnees['imageclic'];?>" width="<?php echo $donnees['width'];?>" height="<?php echo $donnees['height'];?>"> <font style="color: black;"></font><?php
				}	
/* Affichage du lien de téléchargement d'un fichier dans la home page */
			if (empty($donnees['fichier1'])) 
				{
				}
				else
				{
				?><p><a href="<?php echo $donnees['repfich1'];?>/<?php echo $donnees['fichier1'];?>" target="_blank"><font style="color: #645E5E;"><?php echo $donnees['titrefichier1'];?></a></font><?php
				}						
/* Affichage du lien de téléchargement d'un fichier dans la home page */
			if (empty($donnees['fichier2'])) 
				{
				}
				else
				{
				?><p><a href="<?php echo $donnees['repfich2'];?>/<?php echo $donnees['fichier2'];?>" target="_blank"><font style="color: #645E5E;"><?php echo $donnees['titrefichier2'];?></a></font><?php
				}						
/* Affichage du lien vers une URL dans la home page */
			if (empty($donnees['url'])) 
				{
				}
				else
				{
				?><p><a href="<?php echo $donnees['url'];?>" target="_blank"><font style="color: #645E5E;"><?php echo $donnees['titreurl'];?> </a></font><?php
				}						
			}
			?>

			
	
   </td><td id="dte"></td></tr>
   <tr><td id="cig"></td><td id="inf"></td><td id="cid"></td></tr></table>
	  </td>
	</tr>
</table>	
	<?php
	mysqli_close($connect);
	?>
</div>
En espérant que vous pourrez m'aider car mon ami ne peut se séparer pour l'instant de son hébergeur et paie donc des frais uniquement le temps qu'on résolve ce souci.
Merci +++++++
Dernière édition par moogli le 11 juin 2017, 14:46, édité 1 fois.
Raison : parce que c'est plus facile à lire en couleur ;)

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7420 Messages

08 juin 2017, 23:06

Bonjour,

Regarde du côté du transfert des données de la BDD.
Tu as probablement un pb au moment de l'export ou au moment de l'import où tu peux choisir le charset.
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 9 Messages

09 juin 2017, 22:35

Merci pour ta réponse.
Je viens donc de passer ma soirée a refaire des tests de transfert inter-BDD.
Export de la BDD (datas uniquement car typage des colonnes sources incorrect parfois) de la base de prod (sur laquelle je n'ai pas de souci d'encodage) vers la BDD de Preprod.
Export réalisé en UTF8. (l'affichage du fichier d'export sous éditeur restitue correctement les caractères accentués)
Import des Datas dans une table dont les colonnes ont été configurées en TEXT (pour celles qui contiennent du texte) et interclassemeint UTF8_general_ci.
La consultation des datas dans la BDD cible (après import) est conforme (caractères accentués OK)
Par contre restitution navigateur toujours KO
J'en perd mon latin.
Si tu as d'autres pistes/idées je suis preneur
Merci beaucoup par avance

Petit nouveau ! | 9 Messages

11 juin 2017, 09:22

Bonjour

HELP !
Je dois résoudre ce problème avant la fin du mois sous peine que mon pote ait encore à payer son hébergement.
Merci par avance

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

11 juin 2017, 14:53

salut,

as tu regardés ce qu'il y a dans l'entête HTTP ? (chrome / firefox => F12 + onglet réseau). Si le nouveau serveur envoie un content encoding en iso y a de grande chance que ça déconne ensuite.

une solution est d'envoyer la bonne info dans l'entête : header('Content-Type:text/html; charset=UTF-8');
Une solution pour éviter ce genre de problème est de ne pas envoyer les caractères spéciaux mais leurs entités html avec htmlentities (a tester, ça fait un peu de taf mais au moins tu n'auras plus le problème :) )


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

11 juin 2017, 20:08

Bonjour.
Merci pour cette réponse mais cela n'a rien donné
Pa contre en changeant le type des champs et en les forçant à BLOB, l'affichage est ok.
étrange...

Petit nouveau ! | 9 Messages

11 juin 2017, 20:50

Le souci c'est qu'avec ce format BLOB (binaire) je ne peux plus voir en clair le contenu de mes Datas dans la table......

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7420 Messages

12 juin 2017, 08:44

Il faut que tu configures phpmyadmin pour afficher le contenu des BLOB.
Si tu as un phpmyadmin fourni par ton hébergeur, essaye d'aller dans "Options" (juste au dessus de la liste des résultats), puis "Texte complet" et "Montrer le contenu BLOB" (l'existence de cette option dépend de ta version de phpmyadmin)

Sinon la solution c'est d'installer toi même phpmyadmin https://www.phpmyadmin.net sur ton hébergement et d'ajouter à la fin du fichier config.inc.php les lignes suivantes :
$cfg['ProtectBinary'] = FALSE;
$cfg['DisplayBinaryAsHex'] = FALSE;
$cfg['ShowBlob'] = TRUE;
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 9 Messages

12 juin 2017, 19:56

OK. Merci pour cette info. Je vais regarder.
Sinon je penche aussi pour un problème de configuration serveur qui ne serait pas en UTF.

Petit nouveau ! | 9 Messages

16 juin 2017, 21:21

Bonsoir,
Mon problème n'étant toujours pas résolu je reviens faire appel à vous Ô grands manitous du PHP.
Voilà la situation à ce soir :

Je m'explique :

Le texte "Lé MOT DU PRESIDENT" est en dur dans ma page PHP (bien en UTF8)
=> l' accent que j'ai forcé "Lé" pour le test directement dans la page PHP est bien interprété

Le reste du texte est récupéré en BDD et est mal interprété/restitué malgré une table et un champ en UTF8.

Image

J'en déduis que ce n'est pas un problème d'encodage de ma page.
Info : Elle débute bien par
<?php
header ('Content-type:text/html; charset=utf-8');
?>

Sur base de ces éléments, d'après vous de quel côté faut-il chercher ?
Merci ++++++++++

Mammouth du PHP | 874 Messages

16 juin 2017, 23:13

Exemple :
Dans la BDD (table "message") j'ai :
<b>19/02/2017</b> : <p>
"Ravalement" en profondeur du site internet du club + changement de l'hébergement du site.
c'est correct dans phpmyadmin, c'est bien cela ?
si c'est le cas, peut-être :
http://php.net/manual/fr/mysqli.set-charset.php

Petit nouveau ! | 9 Messages

17 juin 2017, 19:14

Genial.
Problème résolu en rajoutant le code suivant dans mes pages :

/* Modification du jeu de résultats en utf8 */
if (!mysqli_set_charset($connect, "utf8")) {
printf("Erreur lors du chargement du jeu de caractères utf8 : %s\n", mysqli_error($connect));
exit();
}
Merci à tous ceux qui m'ont aidé sur ce sujet.
C'est TOP.