[Résolu] utf-8: un coup oui, un coup non...

Eléphant du PHP | 250 Messages

07 févr. 2012, 15:22

Bonjour
Je soumet à votre sagacité (et expérience) le soucis suivant:
Je dois afficher un texte issue de base MySql. Le texte en base est encodé en utf-8_unicode_ci et ne présente aucun défaut dans PhpMyAdmin.
Lorsque dans une page, j'affiche l'intégralité du texte, pas de soucis d’affichage.
Mais lorsque, pour le même texte, dans une autre page, j'extraie une partie de celui-ci (les 10ers mots) pour en faire un lien "Lire la suite...", là, tous les accents deviennent ces horribles petites choses: �
Bon, non seulement c'est laid, mais en plus ça rend le texte illisible.

Donc, ceci fonctionne:
echo '<p>'.nl2br($descriptif).' </p>';
Ceci non:
    $machaine =$all['descriptif'];
    //on la coupe au niveau des espace , on recupére dans un tableau
    $tmots = explode(' ',$machaine);
    //ou coupe notre tableau afin de n'avoir que 10 valeurs
    $tnewChaine = array_slice($tmots, 0, 10);
    //on recolle la chaine
    $newChaine = implode( ' ',$tnewChaine);
	echo '<p> '.$nom_album .'<br />'.$newChaine.' ...<a href="folio.php?album='.$id.'">Lire la suite...</a></p>';
Côté header html, les 2 pages sont identiques:
    <meta charset="utf-8">         
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />    
Et toutes les 2 écrites avec Notepad++ en utf-8 sans BOM......
Testé avec différents navigateurs, même résultat !
J'ai tenté un htmlentities, qui résolvait bien mon soucis d'affichage pour les accents, mais qui, du coup (et c'est normal) m'affichait mes balises
<br />
.....

Là, j'avoue que je sèche un peu.
Auriez vous une piste, une idée, un conseil?

D'avance merci
Modifié en dernier par Boro64 le 07 févr. 2012, 17:26, modifié 1 fois.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 févr. 2012, 17:03

salut,

il me semble qu'explode ne gère pas les chaine utf-8 oriente toi plutot vers l'extension mbstring avec par exemple mb_split

edit : d'ailleus un commentaire de la doc d'explode semble aller dans ce sens (et indique l'extension iconv).


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

ViPHP
xTG
ViPHP | 7331 Messages

07 févr. 2012, 17:23

Oui je confirme, explode() fonctionne au coeur du moteur PHP et utilise donc de l'iso.

Eléphant du PHP | 250 Messages

07 févr. 2012, 17:26

Une fois de plus, merci à toi moogli =D>
Effectivement, en faisant
echo mb_internal_encoding();
, s'affichait ISO-8859-1 .......
Et effectivement ta solution iconv() relevé dans la doc supprime le soucis.
Ce qui au final donne:
							    //la chaine de plus de 10 mots
    $machaine =$all['descriptif'];
    //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 10 valeurs
    $tnewChaine = array_slice($tmots, 0, 10);
    //on recolle la chaine
    $newChaine = implode( ' ',$tnewChaine);

	echo '<p> '.$nom_album .'<br />'.iconv("ISO-8859-1", "UTF-8",$newChaine).' ...<a href="folio.php?album='.$id.'">Lire la suite...</a></p>';

NB: Pendant que tu prenais soin de me répondre, j'étais plongé dans l'excellent tuto d' AB que je me permet de conseiller à tous .

NB2: Merci à toi aussi xTG dont la réponse arrive pendant la rédaction de ma réponse. =D>
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."