encodage sur les caractères : quote, tirets
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:
Code:
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" /> |
les données sont affichées correctement, c'est-à-dire que:
"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) :
Code:
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"; |
SI j'affiche la requête, j'obtiens:
Citation:
UPDATE Etudiants SET [...], TitreMemoire='Mise en place d'un outil d'évaluation socio-économique adapté aux projets de transport ferroviaire', UrlMemoire= [...] WHERE Identifiant='358'
et elle fonctionne.
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:
Code:
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.'",'; |
MAIS LA, impossible d'afficher correctement les caractères encodés:
', ’, ", ‐, – 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
Code:
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.'",'; |
Une solution des plus bancales :?
Comment résoudre ce problème?