Partage

Encodage en UTF-8

problème

Sujet résolu
Le 16 avril 2012 à 19:00:19

Bonjour, je suis Atbbkaugust, développeur web amateur et j'ai décidé de passer mon site à l'encodage UTF-8, j'ai donc tout fait correctement, c'est à dire :

- J'ai mis mes tables et colonnes sql en UTF-8 (ALTER TABLE etc.)
- J'ai mis le header PHP pour UTF-8 (<?php header('content-type: text/html; charset=utf-8'); ?>)
- J'ai mis l'indication d'encodage UTF-8 en html5 (<meta charset="utf-8">)
- J'ai mis ceci après ma connexion à ma BDD : $bdd->query("SET NAMES 'utf8'");
- J'ai, grâce à Sublime Text 2 réouvert tous mes fichiers avec l'encodage UTF-8
- J'ai aussi essayé de mettre ça : echo utf8_decode();

Malgré tout cela, lorsque je charge ma page index avec mes news, les titres passent bien, mais dans le contenu à la place des accents et autres caractères spéciaux j'ai ceci : è ou encore ceci é et aussi quelques losange avec des points d'interrogation dedans.

Merci pour votre aide future :) .
Publicité
Le 16 avril 2012 à 19:00:19
Le 16 avril 2012 à 22:10:24

- J'ai mis ceci après ma connexion à ma BDD : $bdd->query("SET NAMES 'utf8'");
À la place rajoute la commande lors de la création de ton instance PDO.
Exemple tirer de ma classe DBFactory
<?php
return new PDO($strConnect, self::$tabCfg['userName'], self::$tabCfg['pass'], array(1002 => 'SET NAMES \'UTF8\'', PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => self::$tabCfg['errMode']));

La partie intéressante:
<?php
array(1002 => 'SET NAMES \'UTF8\'');


- J'ai, grâce à Sublime Text 2 réouvert tous mes fichiers avec l'encodage UTF-8
Tu dois choisir UTF-8 (sans bom) si c'est pas lui tu as prit.

Tu as un lien dans ma signature "UTF" qui te dis les choses a ne pas oublier pour évité que je te les renomme tous. Comme celle de mettre:
AddDefaultCharset UTF-8

Dans un fichier .htaccess à la racine de ton site.
Le 16 avril 2012 à 22:18:01

bonjour,

mettre
mysql_query("SET NAMES UTF8");


dans les fichiers php
Le 17 avril 2012 à 1:07:16

@Belzbuth : merci pour la première proposition, j'essayerais tandis que pour la seconde j'ai essayé de mettre ceci dans un .htaccess, mais j'imagine que mon hébergeur ne gère pas les .htaccess mais la page me renvoyait sur une erreur (503 il me semble) lorsque j'ajoutais le .htaccess.

Edit : Je vois pas bien où mettre la ligne, pour la connexion j'ai quelque chose comme ça :
<?php
session_start();

		try
		{
			// On se connecte à MySQL
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$bdd = new PDO('mysql:host=***;dbname=***', '***', '***');
			$bdd->query("SET NAMES 'utf8'");
		}
		catch(Exception $e)
{
    // En cas d'erreur précédemment, on affiche un message et on arrête tout
    die('Erreur : '.$e->getMessage());
}
?>


@sagittaire : Je n'utilise pas Mysql, mais PDO et j'ai déjà inclu cette ligne : $bdd->query("SET NAMES 'utf8'");
Le 17 avril 2012 à 1:24:49

Salut,

Je me trompe peut-être, mais essaye de glisser un uft8_encode(); sur les bouts de textes qui posent problèmes ... ?
Le 17 avril 2012 à 1:48:34

Tu utilises un tableau d'option pour PDO mais tu lui passes pas en paramètre lol. Tien code corriger avec ce que je disais dans mon premier messages en plus:

<?php
session_start();

		try
		{
			// On se connecte à MySQL
			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
			$pdo_options[1002] = 'SET NAMES \'UTF8\'';
			$bdd = new PDO('mysql:host=***;dbname=***', '***', '***', $pdo_options);
		}
		catch(Exception $e)
{
    // En cas d'erreur précédemment, on affiche un message et on arrête tout
   exit('Erreur : '.$e->getMessage());
}


Du même coup quand tu va avoir une erreur venant de PDO il va généré une exception comme tu voulais dans le fond :p

Pour ce qui est du fichier .htacess je peux pas dire sa dépend toujours de l'hébergeur. Oubli pas de lire tutoriel dont le lien 'UTF' est dans ma signature pour voir se que tu aurais pu oublier.
Le 17 avril 2012 à 12:01:52

@metayd : merci mais j'ai essayé utf8_encode et utf8_decode ça marche pas.

@Belzebuth : Ok j'essaye, j'édite pour dire si ça marche. Edit : ça marche pas :/
Le 17 avril 2012 à 13:06:55

Essaie ça plutôt:
<?php
session_start();
try {
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root', $pdo_options);
$bdd->exec("SET CHARACTER SET utf8");
} catch(Exception $e) {
    //on affiche un message d'erreur ainsi que les erreurs
    echo 'Tout ne s\'est pas bien passé, voir les erreurs ci-dessous<br />';
	echo 'Erreur : '.$e->getMessage().'<br />';
    //on arrête l'exécution s'il y a du code après
    die();
}
?>
Le 17 avril 2012 à 15:01:28

Merci pour le code JUARAGON mais ça ne change rien à mon problème, après c'est vrai que ton code a l'air plus propre.
Le 17 avril 2012 à 17:32:37

t'a vérifié que ta base de donnée enregistre bien les caractères en utf-8 ?
t'a page est-elle en utf-8 sans bom ?
Le 17 avril 2012 à 17:53:05

Tu peux aussi modifier le fichier de configuration de ton serveur Apache (httpd.conf) en rajoutant la ligne suivante:

AddDefaultCharset UTF-8
Le 17 avril 2012 à 17:58:13

@JUARAGON : bah j'ai converti toute ma BDD en UTF-8.
@Leon@rd : Je suis sur un serveur mutualisé.

Merci pour toutes vos réponses, j'espère que l'on trouvera la solution.
Le 17 avril 2012 à 18:04:00

<?php$db = new PDO('mysql:host=***;dbname=***', '***', '***', array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')); ?>
Le 17 avril 2012 à 19:08:44

Merci mais ça ne marche toujours pas.
Je vous remercie de m'aider :) , ça vient sûrement de la BDD, je vais essayer de créer une table en UTF-8 (toutes mes autres tables sont sensées être en UTF-8 mais bon) et essayer d'afficher du texte.
Ce que je ne comprends pas c'est que les titres eux passent correctement.

Edit :

Désolé, petite erreur de ma part, j'ai résolu mon problème (grâce à vous :D ), j'avais bien appliqué utf8_decode() mais pas sur le bon bout de code, finalement pour afficher le contenu de ma news ça donne ça : echo zcode(utf8_decode(stripslashes($donnees['contenu'])));

Merci beaucoup à tous, je vois que la communauté du siteduzéro est toujours amicale et qu'elle aide encore les gens, contrairement à ce que dise certains. :)
Le 17 avril 2012 à 22:36:54

Hum, tu patch un problème sans vraiment le régler.

- stripslashes() ? Désactive tes magic quotes à la place.

- utf8_decode() -> sa veux dire que depuis le début le problème viens pas de ta base de données car si tu dis sa affiche correctement en utilisant cette fonction c'est que le 'contenu' est en utf-8 et tu le converti en ISO avec cette fonction donc l'affichage PHP il te manque des choses.

- Pour en revenir sur la ligne dans le .htaccess, tu dis que quand tu as créer le fichier .htaccess à la racine de ton site il ta afficher une 503. C'est signe, fort probablement, que ton héberger prend en compte les .htaccess.

Si tu nommes ton héberger les gens qui l'utilises pourrait te répondre sinon l'héberger a surement une FAQ ou google peut t'aidé a trouvé. Comme mon héberger si je veux le faire passé a PHP version presque la plus récente je dois mettre dans mon .htaccess une ligne spécifique. Tout dépend de l'héberger mais même en mutualiser le mien(GoDaddy) accepte les .htaccess et les php.ini.

Au faite, as tu été lire le tutoriel ?
Le 18 avril 2012 à 0:36:05

@Belzebuth : Mon hébergeur c'est 1&1, de quel tutoriel parles-tu ?
Le 18 avril 2012 à 1:09:00

"Tu as un lien dans ma signature "UTF" qui te dis les choses a ne pas oublier pour évité que je te les renomme tous."

"Oubli pas de lire tutoriel dont le lien 'UTF' est dans ma signature pour voir se que tu aurais pu oublier."

Signature = tu vois en bas quand je poste un message il est marquer "Liens utiles:" avec plein de lien clic sur 'UTF' ...
Le 18 avril 2012 à 1:25:48

@Belzebuth : merci beaucoup, mais j'avais déjà lu le tutoriel et il dit à la fin ""é", "î", "Ã" etc. => la chaine de caractères est encodée en UTF-8 mais le navigateur croit avoir affaire à de l'ISO-8859-1 (probablement parce que votre page dit au navigateur qu'elle utilise l'ISO-8859-1). Utilisez la fonction utf8_decode sur la chaine de caractères posant problème si elle est issue d'une variable PHP." chose que je fais, et donc mon problème est réglé, si j'enlève ceci ça marche plus.

Sinon j'ai rajouté la ligne dans le .htaccess, elle ne devait pas marcher à cause d'une erreur de syntaxe ou je ne sais quoi.
Le 18 avril 2012 à 1:37:41

"Sinon j'ai rajouté la ligne dans le .htaccess, elle ne devait pas marcher à cause d'une erreur de syntaxe ou je ne sais quoi."

Et elle fonctionne maintenant ?

Si elle ne fonctionne toujours pas je te conseilles d'ouvrir un autre topic avec dans le titre [1&1] UTF-8. Et dire que quand tu ajoutes AddDefaultCharset UTF-8 dans le fichier .htaccess sa ne fonctionne pas. Hum, peut-être un problème de dire dans un php.ini d'accepter les .htaccess.

Pas juste a cause du "AddDefaultCharset UTF-8" mais les .htaccess sont indispensable si on pense juste a bloquer l'accès a un dossier ou désactivé l'affichage apache par défaut des dossiers quand il y a pas de fichier index dans un répertoire.

Tu peux en même temps dans ton fichier php.ini si tu as accès surement remarque car je crois c'est toi qui faut qui le crée et le mettre à la racine ou un php5.ini désactivé les magic_quotes.

À toi de voir.
Le 18 avril 2012 à 1:59:11

La ligne du fichiers .htaccess marche (d'ailleurs ça a résolu le problème de certains accents qui buggaient encore).

Encodage en UTF-8

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown