Bonjour

J'essaie de résoudre un petit problème qui ne prête pas à conséquence, mais qui pique quand même les yeux. J'ai bien vu que des questions similaires ont été posées, mais je n'ai pas vu de vraie réponse, donc je tente à nouveau ma chance.

J'ai créé un modeste CMS (1) avec donc son back-office et sa base de données. L'affichage est défini, comme tout le monde ou presque le conseille en utf-8 :



<!DOCTYPE html>
<html>
	<head>
		<meta Charset='UTF-8'>
		<title> ...


J'enregistre sans souci dans la base en prenant bien soin de signaler que c'est bien du utf-8 que j'envoie :

			try {
				$db= new PDO($dsn, $utilisateur, $mdp) ;
		       		$db->exec('SET CHARACTER SET UTF-8');
		       		$log = $log . "la connexion a réussi.<br>" ;
			} catch (PDOException $e) {
				echo "Raté!!! " . $e->getMessage() . "<br>" ;
				die();
			}

et au niveau de la base, tout ce que j'ai pu trouver comme réglage est réglé sur utf-8. Dans phpMyAdmin, au niveau du serveur, Interclassement pour la connexion au serveur = utf8_general_ci, dans opérations sur la base, Interclassement : utf8_general_ci ; à chacune des tables, également Interclassement : utf8_general_ci.

Reste que l'enregistrement sur la base c'est un encodage type ISO : "L'été indigène à l'abri des contrôles inouïs." devient "L'été indigène à l'abri des contrôles inouïs..". Si j'enregistre la phrase directement dans la base avec phpMyAdmin, l'affichage sur le site devient "L'?t? indig?ne ? l'abri des contr?les inou?s" .

Qu'est-ce que j'ai pu oublier ?

Merci d'avance

Réfléxive


1. Si vous vous demandez pourquoi se prendre le chou avec un CMS fait maison je répondrai que c'est pour comprendre et qu'on ne m'y reprendra plus !
Salut,

Est ce vraiment grave que DANS la base de données ce ne soit pas du utf8 ? il suffit en php de faire un utf8_decode() ou utf8_encode() pour transformer le tout.
Modifié par JENCAL (16 Jul 2015 - 14:26)
Merci de prendre le temps pour répondre.

Non, ce n'est pas grave. Mais en dehors de piquer les yeux, à mon sens c'est le signe que l'application est boîteuse. C'est troublant que l'on indique partout sur phpMyAdmin qu'on veut un encodage utf-8, et qu'il persiste à enregistrer dans mysql en ISO ou je ne sais quoi d'autre. Non?

Puis, je ne peux pas croire que c'est comme ça que c'est censé se passer.

utf8_encode() et utf8_decode(), il faudrait les mettre à chaque requête ?
Sinon, si tu clic sur ta base de données et que tu va dans dans l'onglet OPERATION ? tu as bien UTF8 GENERAL CI ?

EDIT : Je comprend bien... mais si tu créer une nouvelle base de test.. le problème persiste ?
Modifié par JENCAL (16 Jul 2015 - 14:27)
Oui, j'ai trouvé trois endroits pour mettre utf8_general_ci.Sur le lien serveur:localhost, juste au dessus des onglets ; au niveau des tables, onglet structure; et dans opérations, comme tu l'as proposé.
Modifié par Reflexive (16 Jul 2015 - 14:32)
Sinon

- tes fichiers qui contienne le code php ne sont pas encode en utf8 (avec notepad++ tu devrai convertir en utf8 sans bom)
- (SET NAMES 'utf8') pour la connexion
- essaye utf8 encode en php
- check bien les table, colonnes, table
Bravo !!

C'était bien SET NAMES la solution.

Les fichiers étaient bien encodés en utf-8. J'en ai vérifié quelques uns, mais c'était sans surprise. Je code en Sublime Text et l'encodage par défaut est bien utf-8.

Mais c'était donc SET NAMES à la place de SET CHARACTER SET, comme ça :

			try {
				$db= new PDO($dsn, $utilisateur, $mdp) ;
		       		$db->exec('SET NAMES utf8');
		       		$log = $log . "la connexion a réussi.<br>" ;
			} catch (PDOException $e) {
				echo "Raté!!! " . $e->getMessage() . "<br>" ;
				die();
			}


Pour celui ou celle qui aurait le même problème : les apostrophes englobent l'ensemble de l'expression, pas seulement 'utf8'.

En tout cas, merci beaucoup !
Modérateur
Salut,

JENCAL a écrit :
Est ce vraiment grave que DANS la base de données ce ne soit pas du utf8 ?



Oui puisque les données ne sont plus intègres. Je veux dire par là, le souci de notre ami Reflexive est qu'il envoie des données en iso dans de l'utf-8.



JENCAL a écrit :

- tes fichiers qui contienne le code php ne sont pas encode en utf8 (avec notepad++ tu devrai convertir en utf8 sans bom)
- (SET NAMES 'utf8') pour la connexion
- check bien les table, colonnes, table


+1

Au lieu de faire une requête pour indiquer à pdo l'encodage (pdo::exec()), tu peux lui indiquer lors de la création d'une instance de pdo.



$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
           PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);


JENCAL a écrit :

- essaye utf8 encode en php


Petit bémol. Normalement, il n'y en pas besoin (voir ma réponse plus haut)
Comme ça ça marche très bien, me semble-t-il :

try {
	$db= new PDO($dsn, $utilisateur, $mdp, array(
		PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) ;
   	$log = $log . "la connexion a réussi.<br>" ;
} catch (PDOException $e) {
	echo "Raté!!! " . $e->getMessage() . "<br>" ;
	die(); 
}