Bonjour,
je rencontre un problème d'encodage sur une base mysql 5.5.24 :
j'ai une base, 'labase', encodée en utf8_general_ci
qui contient des tables encodées en latin1_swedish_ci
avec des colonnes en latin1_swedish_ci
par exemple: pour "l'agglomération", phpmyadmin affiche "l'agglomération".
pour "l'agglomération", phpmyadmin affiche "l'agglomération".
Sur une page php dont voici les headers:
les données sont affichées correctement, c'est-à-dire que:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Language" content="fr" />
"l'agglomération" s'affiche "l'agglomération"
Sur cet page il y a une requête sql update (c'est un site qui date) :
SI j'affiche la requête, j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 $AdminConnect = mysql_connect($hostname_AdminConnect, $username_AdminConnect, $password_AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG)); mysql_select_db($database_AdminConnect, $AdminConnect); if (isset($_REQUEST['TitreMemoire'])) { $TitreMemoire = netString($_REQUEST['TitreMemoire']); } else { $TitreMemoire=null; } /** * dans un autre fichier inclus */ function netString($chaine) { // Nettoyage $chaine = filter_var($chaine, FILTER_SANITIZE_STRING); $chaine = stripslashes($chaine); // Supprimer les espaces de début et de fin $chaine = ltrim($chaine); $chaine = rtrim($chaine); return $chaine; } // fin et reprise du fichier main.php $query_UpdateForm = "UPDATE Etudiants SET TitreMemoire='$TitreMemoire' WHERE Identifiant='$id';" $UpdateForm = mysql_query($query_UpdateForm, $AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG)); $message="Opération ok";
et elle fonctionne.UPDATE Etudiants SET [...], TitreMemoire='Mise en place d'un outil d'évaluation socio-économique adapté aux projets de transport ferroviaire', UrlMemoire= [...] WHERE Identifiant='358'
Par contre, si l'on regarde dans phpmyadmin les apostrophes sont remplacées par '(avec point virgule bien sur) et les tirets (par exemple), les quotes sont remplacés aussi.
Lors de l'update, dans la table, les apostrophes ' sont remplacés par ' par exemple.
SI ce n'était que cela ce ne serait pas un problème, sauf qu'il faut pouvoir exporter en csv le contenu de la table Etudiants.
Dans export.php:
MAIS LA, impossible d'afficher correctement les caractères encodés:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 [...] header("Content-Type: text/csv"); header("Content-Disposition: attachment; filename=export.csv"); $liste=$_GET['liste']; $tri=$_GET['tri']; $AdminConnect = mysql_connect($hostname_AdminConnect, $username_AdminConnect, $password_AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG)); mysql_select_db($database_AdminConnect, $AdminConnect); $query_SelectionListe = "SELECT * FROM Etudiants WHERE Identifiant IN($liste)"; $SelectionListe = mysql_query($query_SelectionListe, $AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG)); $row_SelectionListe = mysql_fetch_assoc($SelectionListe); // Ensuite dans une boucle // [...] // je construis mon fichier csv $thechamps1=$row_SelectionListe[$nomduchamp]; $thechamps2=ereg_replace("\""," ",$thechamps1); echo '"'.$thechamps2.'",';
', ’, ", ‐, – soit ', ", ’, ... dans la bdd.
J'ai essayer de résoudre le problème en modifiant l'encodage de la colonne TitreMemoire et de la table Etudiants; en jouant avec mysql_set_charset() (version de php 5.4.3) mais sans succès.
En attendant de résoudre définitivement le problème; la seule méthode que j'ai trouvé c'est de remplacer ces encodages:
dans export.php
Une solution des plus bancales
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $thechamps1=$row_SelectionListe[$nomduchamp]; $thechamps2=ereg_replace("\""," ",$thechamps1); $thechamps2 = ereg_replace("'","'",$thechamps2); $thechamps2 = ereg_replace("","'",$thechamps2); // etc... echo '"'.$thechamps2.'",';
Comment résoudre ce problème?
Partager