8768 sujets

Développement web côté serveur, CMS

Bonjour,

je réalise un site de foot. sur ce site, j’intègre des actus du club. Mon site est en utf8 dans mon head, ma bdd est également en utf8.

Lorsque j'insert une actu via un formulaire, tous les accents sont remplacés par des symboles dans ma bdd de plus, lorsque j'ais ('l'aide') en bdd j'ai ('l\'aide') du coup quand j'affiche mes actus sur le site j'affiche bien mes accents mais j'ai ('l\'aide') a la place de ('l'aide').

Autre problème, je crée un flux rss sur les actus, et là je récupère les symboles de ma bdd qui ne sont pas traduits en utf8 hors je suis bien en utf8.

Enfin pour moi l'encodage a toujours été un sacré bordel!!!!!!

voici le code lorsque j'insert mes actus en bddd
if(!empty($_POST['titre']) && !empty($_POST['texte']))
	{
		$sql=$cnx->query("SELECT * FROM dirigeants WHERE IDDirection = '".$_SESSION['id']."'") or die('ERROR SQL!'.print_r($cnx->errorInfo()));
		$row=$sql->fetch(PDO::FETCH_ASSOC);
		$inserActu= $cnx->prepare('INSERT INTO actualites (Titre, Texte, Auteur) VALUES(:titre, :texte, :auteur)') or die('ERROR INSERT!'.print_r($cnx->errorInfo()));
		$inserActu->execute(array(
				"titre"=>$_POST['titre'],
				"texte"=>$_POST['texte'],
				"auteur"=>$row['NomDirigeant']." ".$row['PrenomDirigeant']
			));
		
		echo '<script language="Javascript">
			
			document.location.replace("actu.php?err=1");
		
			</script>';
		//header('Location: actu.php?err=1');
	}else{
		echo '<script language="Javascript">
			
			document.location.replace("addActu.php?err=1");
		
			</script>';
		//header('Location: addActu.php?err=1');
	}


et voici le code qui génère le flux rss
<?php
require('../config/config.inc.php');
$cnx->exec("SET CHARACTER SET utf8");
echo '<?xml version="1.0" encoding="UTF-8"?>';

$sql = $cnx->query("SELECT IDActu, Titre, Texte, DATE_FORMAT(DateActu, '%D, %d %M %Y %H:%i:%s') AS DateA, Auteur FROM actualites ORDER BY DateA DESC LIMIT 0,9") or die(print_r($cnx->errorInfo()));

?>
<rss version="2.0">
    <channel>
        <title>Actualité ASBelleau</title>
        <description>Actualité du club</description>
        <link>http://www.asbelleau.fr</link>
		<?php
		while($row=$sql->fetch(PDO::FETCH_ASSOC))
		{?>
	        <item>
	            <title><?php echo html_entity_decode(html_entity_decode($row['Titre']));?></title>
	            <description><?php echo html_entity_decode(html_entity_decode($row['Texte']));?></description>
	            <pubDate><?php echo $row['DateA'];?></pubDate>
	            <author><?php echo $row['Auteur'];?></author>
	            <link>http://www.asbelleau.fr/index.php</link>
	        </item><?php
	    }?>
    </channel>
</rss>

Modifié par cid5420 (06 Jun 2014 - 14:53)
Yop,

deux trucs à vérifier :

- As tu encodé ton fichier aussi en UTF-8 ?
- As-tu exécuté "SET NAMES 'utf8';" sur ta base avant de faire quoi que ce soit dessus ? (il faut le faire dans ta page, avant de lancer les requêtes)

++
Nico3333fr a écrit :

- As-tu exécuté &quot;SET NAMES 'utf8';&quot; sur ta base avant de faire quoi que ce soit dessus ? (il faut le faire dans ta page, avant de lancer les requêtes)


Mauvais conseil, pour définir le charset il faut utiliser mysqli::set_charset avec mysqli ou avec PDO il faut préciser le charset dans les paramètres de connexion :

new PDO ("mysql:host=host;dbname=db;charset=utf8", "user", "password")

Si tu utilises une requête SET NAMES l'échappement des données avec mysqli_real_escape_string ou PDO::quote ne se fait pas correctement et tu risques de te retrouver avec des failles de type injection sql même si tu échappes tes données.

MySqli : http://www.php.net/manual/fr/mysqli.set-charset.php
PDO : http://php.net/manual/fr/ref.pdo-mysql.connection.php
Nico3333fr a écrit :
Autant pour moi pour l'imprécision, j'ai posté ça ultra-vite fait. ^^ Smiley confused

Et que ça ne se reproduise plus ! Smiley nono Smiley lol
6l20 a écrit :

Et que ça ne se reproduise plus ! Smiley nono Smiley lol


Je crois qu'il est parti corriger les sites de ses clients en vitesse. Smiley langue
Merci pour vos précision, j'ai juste étais mis sur la voix par nico, je n'ai pas vraiment fait à l'identique.

bien sûr j'ai fais ça dans les règles de l'art ^^
Cela est un peu hors-sujet, mais j'avais également rencontré un problème d'encodage avec le système de fichier de OS X. En effet, lorsque je faisait un readdir sur un répertoire comprenant des fichiers dont le nom comprenait des accents, ceux-ci apparaissaient correctement mais dans une police générique assez moche. Cela était du à l'encodage UTF-8 en norme C du système de fichier de OS X. J'ai fini par réussir à pondre une fonction qui semble-t-il a mieux fonctionné que normalizer_normalize() inclue dans PHP. Je tiens à la poster car je partage la douleur des prochains qui tomberont sur ce problème (sueurs froides, cauchemar... Smiley sweatdrop ), d'autant plus qu'il a fallu que je me débrouille seul car les solutions qui fonctionnent pour ce problème ne grouillent pas sur le net:
function utf8_normalize($str) {
	$nfc=array('A&#204;&#129;','A&#204;&#130;','A&#204;&#128;','A&#204;&#136;','C&#204;&#167;',
		   'E&#204;&#129;','E&#204;&#130;','E&#204;&#128;','E&#204;&#136;','&#197;&#146;',
		   'I&#204;&#129;','I&#204;&#130;','I&#204;&#128;','I&#204;&#136;','N&#204;&#131;',
		   'O&#204;&#129;','O&#204;&#130;','O&#204;&#128;','O&#204;&#136;',
		   'U&#204;&#129;','U&#204;&#130;','U&#204;&#128;','U&#204;&#136;',
		   'a&#204;&#129;','a&#204;&#130;','a&#204;&#128;','a&#204;&#136;','c&#204;&#167;',
		   'e&#204;&#129;','e&#204;&#130;','e&#204;&#128;','e&#204;&#136;','&#197;&#147;',
		   'i&#204;&#129;','i&#204;&#130;','i&#204;&#128;','i&#204;&#136;','n&#204;&#131;',
		   'o&#204;&#129;','o&#204;&#130;','o&#204;&#128;','o&#204;&#136;',
		   'u&#204;&#129;','u&#204;&#130;','u&#204;&#128;','u&#204;&#136;');
	$nfd=array('Á','Â','À','Ä','Ç',
		   'É','Ê','È','Ë','Œ',
		   'Í','Î','Ì','Ï','Ñ',
		   'Ó','Ô','Ò','Ö',
		   'Ú','Û','Ù','Ü',
		   'á','â','à','ä','ç',
		   'é','ê','è','ë','œ',
		   'í','î','ì','ï','ñ',
		   'ó','ô','ò','ö',
		   'ú','û','ù','ü');
	return str_replace($nfc,$nfd,preg_replace('/[^!-%\x27-;=?-~ ]/e','"&#".ord("$0").chr(59)',$str));
}

Là ça ne supporte que le français (et l'espagnol à la limite) mais vous avez compris le principe Smiley cligne
On récupère les codes UTF-8 NFC décimaux des caractères spéciaux, on les entre dans un tableau, on met la correspondance dans un autre tableau, on convertit la chaîne en codes décimaux et on remplace Smiley lol
FraiseTagada99 a écrit :


Je crois qu'il est parti corriger les sites de ses clients en vitesse. Smiley langue


Nop, c'est déjà le cas Smiley lol , mais j'ai répondu à la rache avec le premier truc qui me passait par la tête Smiley smile