Page 1 sur 1

encodage utf-8 partout mais sorties en ISO ou ascii?

Posté : 10 juin 2013, 15:33
par Boro64
Bonjour,
Je suis confronté à un drôle de problème (récurrent avec l'encodage).
Je dois afficher des données à partir d'une base avec un interclassement défini en utf8_unicode_ci, sur des pages avec charset en utf-8, et avec un fichier .htaccess précisant bien : AddDefaultCharset UTF-8.
Dans cette page, soit s'affichent plusieurs annonces avec extrait du texte de chacune et un un lien "Voir le détail de cette annonce", soit (une fois cliqué sur un lien) l'annonce complète.
Le résultat?
Dans les annonces, en lieu et place des caractères accentués s'affichent de magnifiques : � , mais dans l'annonce seule, les caractères accentués s'affichent correctement... :shock:
J'ai (tout?) testé et essayé:
=> déclaration dans la page :
//force l'encodage en utf8 
mb_internal_encoding("UTF-8");
=> déclaration dans mes boucles :
$utf = mysql_query("SET NAMES UTF8");
Rien n'y fait, les accents sont toujours remplacés... :twisted:
Lorsque je fais
echo mb_internal_encoding($le_texte);
dans la page regroupant plusieurs annonces, j'ai en réponse: UTF-8 sur une ou deux annonces, et ASCII sur une autre.
Et si j'enlève
mb_internal_encoding("UTF-8");
et que je fasse un
echo mb_internal_encoding();
une fois j'ai de l'UTF-8, une autre de l'ISO-8859-1.
J'ai lu et relu l'article/tuto de AB à ce sujet (merci encore à lui) et je vois bien que typiquement cela viendrait d'un enregistrement en ISO dans la base...Or, comme dit plus haut, ma base est définie en utf-8. Et les enregistrements actuels ont été réalisés à partir de phpMyAdmin (ce pourrait il que celui-ci travaille en ISO même lorsque tout est réglé en UTF-8?)
Auriez vous des explications, des idées, des pistes, des suggestions, pour résoudre ce soucis?
D'avance merci.

Re: encodage utf-8 partout mais sorties en ISO ou ascii?

Posté : 11 juin 2013, 23:02
par moogli
salut,


A tu regardé l'entête html reçu par le navigateur ? (par exemple avec chrome dans l'interface developper, ctrl+i, tu un as onglet network qui te fournira l'information).

est ce que tu indique un charset dans le header html (la balise cette fois).

a tu un header indiquant le charset à utiliser ?

peux ton voir le code en question ?


@+

Re: encodage utf-8 partout mais sorties en ISO ou ascii?

Posté : 12 juin 2013, 17:56
par Boro64
Bonjour moogli,

Dans le head tout est en place:
  <head>    
    <meta charset="utf-8" />         
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />    
Voilà la partie du code concernée:
	if($type_vente =="occasion"){
	// comptage du nombre de lignes de la base
		$sql = "SELECT count(id_annonce) FROM vente_engins WHERE statut_affichage = 0 AND etat = '$type_vente' ";
		
			//éxécution de la requête
			$resultat = mysql_query($sql);

			//récupération du nombre total à afficher
			$nb_total = mysql_fetch_array($resultat);

			//test pour vérifier si ce nombre vaut 0
			if (($nb_total = $nb_total[0]) == 0) {
			echo "Aucune offre actuellement, désolé! Merci de revenir plus tard ou de nous interroger.";
			}
			else {
			// sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0  
				if (!isset($_GET['debut'])) $_GET['debut'] = 0;
				$nb_affichage_par_page = 4;
	//interrogation de la base 
			$sql1 = "SELECT * FROM vente_engins WHERE etat = '$type_vente' AND statut_affichage=0 ORDER BY id_annonce  DESC LIMIT " .$_GET['debut'].','.$nb_affichage_par_page;
				$req1 = mysql_query($sql1) or die ('Erreur lors de la requête '.$sql1.'<br />'. mysql_error());
					// on affiche enfin notre barre 
					echo '<nav id="nbr-affichage">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 5).'</nav>';
						
					}//fin de la barre de navigation
		while ($row_ann = mysql_fetch_array($req1)){
			
			echo '<article class="annonce">';
					$id_annonce = trim($row_ann['id_annonce']);
				$titre_annonce = trim(stripslashes($row_ann['titre_annonce']));
				$texte_annonce = stripslashes(trim($row_ann['texte_annonce'])); 
				$marque = stripslashes(trim($row_ann['marque']));
				$type = stripslashes(trim($row_ann['type']));
				$ref = trim(stripslashes($row_ann['ref']));
				$annee = trim(stripslashes($row_ann['annee']));
				$dossier_img = trim(stripslashes($row_ann['dossier_img']));
				$path_dossier = trim("img_annonces/$dossier_img");
				$path_thumb = trim("img_annonces/$dossier_img/pictos"); 
				$prix = stripslashes(trim($row_ann['prix']));
					$prix = number_format($prix);
					$prix = str_replace(",", " ", $prix);
					    //la chaine de plus de 20 mots
    $machaine =$texte_annonce;
    //on la coupe au niveau des espace , on recupére dans un tableau
    $tmots = mb_split(' ',$machaine);
    //ou coupe notre tableau afin de n'avoir que 20 valeurs
    $tnewChaine = array_slice($tmots, 0, 20);
    //on recolle la chaine
    $newChaine = implode( ' ',$tnewChaine);	
			echo '<header class="titre_annonce">'.$titre_annonce.'</header>';
				echo '<p> - Type: '.$type.'<br /> - Année: '.$annee.'<br /> - Ref: '.$ref.'<br />';
					echo''.nl2br($newChaine).'<br />';
						echo '<span class="exergue">Prix: '.$prix.' €</span>';
						$statut = $row_ann['statut_vente'];
				if ($statut == 0){echo '<p class="disponibilite">Disponible !</p>';}
				else {echo '<p class="indisponibilite">Vendu !</p>';}
			
					echo '<p>
					<a href="detail_annonce_'.$id_annonce.'.htm" title="">Voir détail de cette annonce</a>
						</p>';
				echo '</article>';/*fin article annonce*/
		}//fin du while

				}//fin des lots de vente des machines occasion
et voici le code de l'annonce selectionnée:
//début de l'affichage d'une annonce
	if(isset($id_annonce_byget) && !empty($id_annonce_byget)){

			$sql = mysql_query("SELECT * FROM vente_engins WHERE id_annonce = $id_annonce_byget");
		while ($row_ann = mysql_fetch_array($sql)){
		
				echo '<article id="annonce_unik">';
			
			$id_annonce = trim($row_ann['id_annonce']);
			$titre_annonce = trim(stripslashes($row_ann['titre_annonce']));
			$texte_annonce = stripslashes(trim($row_ann['texte_annonce']));
			$marque = stripslashes(trim($row_ann['marque']));
			$type = stripslashes(trim($row_ann['type']));
			$ref = trim(stripslashes($row_ann['ref']));
			$annee = trim(stripslashes($row_ann['annee']));
			$dossier_img = trim(stripslashes($row_ann['dossier_img']));
				$path_dossier = trim("img_annonces/$dossier_img");
				$path_thumb = trim("img_annonces/$dossier_img/pictos"); 
			$prix = stripslashes(trim($row_ann['prix']));
			$prix = number_format($prix);
			$prix = str_replace(",", " ", $prix);
			
			echo '<header class="titre_annonce">'.$titre_annonce.'</header>';
				echo '<h3>Type: '.$type.' - Année: '.$annee.' - Ref: '.$ref.'</h3>';
							$statut = $row_ann['statut_vente'];
				if ($statut == 0){echo '<p class="disponibilite">Disponible !</p>';}
				else {echo '<p class="indisponibilite">Vendu !</p>';}
					echo'<p>'.nl2br($texte_annonce).'<br />';
						echo '<span class="exergue">Prix: '.$prix.' €</span><br /></p>';
						echo'<figure><img src="images/test/occasion_ez-go.jpg" alt="occasion ez-go" /><figcaption>'.$titre_annonce.'</figcaption></figure>';
					
					include('codes/mail_annonce.php');
				echo '</article>';/*fin article annonce*/
				
		}//fin du while
	}//fin du if(isset($annonce) && !empty($annonce))
Lorsque cette dernière est affichée, pas de défauts d'encodage, les lettres accentuées s'affichent bien.
NB: j’utilise Notepad++, encodage utf-8 (sans BOM)
Merci de tes avis et conseils