IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Encodage des caractères [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut Encodage des caractères
    EDIT : nouveau problème à la fin du sujet

    Bonjour,

    décidément je n'arrive pas à me passer du forum ...

    J'ai passé toute ma base ainsi que mes pages en UTF-8. Je me suis rendue compte qu'avec la fonction strtolower(), ça ne fonctionnait pas et j'ai lu sur le web que c'était normal.

    J'utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_strtolower($donnees['nom_categorie'],'UTF-8')
    qui fonctionne.

    Mais, j'aimerai remplacer mes caractères accentués comme â ou é par a ou e.
    J'ai donc voulu utiliser la fonction strtr() comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
    $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
    Et là, au lieu d'avoir maître > maitre, j'obtiens 'mau-tre'.
    Est-ce que c'est normal par rapport à mon code (ça doit sûrement être ça) ?

    Si c'est normal, pas moyen de faire autrement de manière à ce que mes caractères accentués soient remplacés normalement ?

    EDIT : hum, j'espère être dans la bonne partie du forum au fait ... j'ai un doute. Si un modérateur ou admin passe par là, vous pouvez déplacer le post s'il vous plait ?

  2. #2
    Membre éclairé Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut
    Euh, j'ai juste voulu tester ton code pour voir un peu le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      $nomcatform = 'maître';
     
      $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
      $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
     
      echo $nomcatform."<br />".$nomcat;
    ?>
    et j'obtiens bien
    Du coup ton erreur ne doit pas être là...

  3. #3
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Merci d'avoir testé ! Ben du coup je vais chercher ailleurs, mais je ne vois pas trop d'où ça peut venir ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // On écrit tout en minuscule
    $nomlower = Securite::bdd(mb_strtolower($donnees['nom_categorie'],'UTF-8'));
    // On enlève les espaces
    $nomreplace = str_replace(' ','',$nomlower);
    // On enlève les quotes
    $nomreplace2 = str_replace('\'','',$nomreplace);
    // On enlève les \
    $nomcatform = str_replace('\\','',$nomreplace2);
    avec Securite::bdd :
    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
     
    class Securite
    {
    	// Données entrantes
    	public static function bdd($string)
    	{
    		// On regarde si le type de string est un nombre entier (int)
    		if(ctype_digit($string))
    		{
    			$string = intval($string);
    		}
    		// Pour tous les autres types
    		else
    		{
    			$string = mysql_real_escape_string($string);
    			$string = addcslashes($string, '%_');
    		}
    		return $string;
    	}
    }
    Ceci me renvoie la bonne chaîne : maîtredouvrage
    Et là je veux remplacer les caractères accentués, donc avoir : maitredouvrage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // On enlève les caractères accentués des noms des catégories
    $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
    $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
    Et j'obtiens : mau-tredouvrage

    Donc je ne vois pas d'où ça peut venir si ce n'est du strtr, ou du preg_replace ...

    Mes pages sont en UTf-8, ma base de données aussi.

    EDIT : avec maître d'ouvrage délégué, j'obtiens : mau-tredouvrageduiluiguui

    donc le problème doit bien se situer dans mes deux fonctions quand même oO

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Question récurrente : strtr ne gère pas les caractères multi-octets. Il faut utiliser autre chose ou décoder puis réencoder après la chaîne.

    Et preg_replace a normalement besoin de l'option u avec de l'UTF-8.

  5. #5
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Merci pour ta réponse julp.

    Il faut utiliser autre chose ou décoder puis réencoder après la chaîne.
    Comme utf8_encode et utf8_decode ? Si c'est ça, j'ai testé sans succès ...
    Je vais voir pour l'option u de preg_replace.

  6. #6
    Membre éclairé Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut
    Si tu fais un echo de $nomlower, tu as bien "maître d'ouvrage délégué" ?

    Pour ce qui est de ta fonction, j'avoue ne pas connaître mysql_real_escape_string et autres... Essaies de faire un echo de ta variable à chaque étape, ça peut te permettre de voir d'où vient l'erreur précisément.

  7. #7
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'nom lower : '.$nomlower.' nomreplace : '.$nomreplace.' nomreplace2 : '.$nomreplace2.' nomcatform : '.$nomcatform.' nomcat : '.$nomcat.'<br />';
    Et cela me renvoie :

    nom lower : maître d\'ouvrage délégué nomreplace : maîtred\'ouvragedélégué nomreplace2 : maîtred\ouvragedélégué nomcatform : maîtredouvragedélégué nomcat : mau-tredouvrageduiluiguui
    Donc c'est bien à la dernière étape que j'ai un problème.

    EDIt : les tests avec encode et decode ne donnent rien.
    Dois-je me servir de str_replace sinon ?

    EDIT 2 : testé avec str_replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $accent = array('à','ç','è','é','ê','ë','î','ï','ô','ù','û'); 
    $sansacc = array('a','c','e','e','e','e','i','i','o','u','u');
    $nomcat = str_replace($accent,$sansacc,$nomcatform);
    Et ça fonctionne.
    Donc je vais garder ceci ! Merci d'avoir répondu

  8. #8
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Je reprends ce post parce que c'est un peu lié, et cette fois à MySQL aussi.

    J'ai un problème au niveau de l'encodage des caractères.

    Voilà ce que j'ai : Projet n°1 / à propos
    au lieu de : Projet n°1 / à propos

    J'ai passé toute ma base mysql en utf8_general_ci.
    Sur mes pages j'ai mis : mysql_set_charset('utf8'); .
    J'ai aussi : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    J'ai testé : mysql_query("SET NAMES 'utf8'"); écrit ici.

    Le nom dans ma base de données est enregistré comme : Projet n°1.

    Mais rien n'y fait. Où ai-je oublié quelque chose ? Est-ce que j'ai loupé une étape importante ?

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Et ton éditeur de code, il est bien configuré en pour te faire des fichiers en UTF-8?

  10. #10
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Notepad++ > encoder en UTF-8 (sans BOM), format UNIX

  11. #11
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Bah effectivement c'est bizarre, et tu as vérifié si tes tables étaient en UTF_8 aussi ainsi que les champs de tes tables?

  12. #12
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Oui j'ai revérifié, tout est en utf-8.

    Et un truc étrange :
    - j'affiche trois parties différentes dans ma page, récupérant des données de trois tables différentes.

    Pour deux des trois tables, mes accents sont bien réécrits, sauf pour la troisième !

    J'ai vérifié sur mes pages d'ajout, le code est le même au niveau de l'encodage, et dans la base tout est enregistré de manière correcte.

    ex : (Sâlpètre) > s'affiche correctement venant de la première table.
    ex2 : n°1 > devrait afficher n°1 venant de la seconde table (même exemple avec : à propos )

    Une petite idée ? Vous avez besoin de voir du code ? Moi je sèche ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Encodage des caractères sous php4 lors de reception
    Par UN|X` dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/04/2007, 15h50
  2. [mysql]encodage des caractères
    Par ideal23 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2006, 13h16
  3. Probleme d'encodage des caractères spéciaux
    Par pacoulitou24 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/06/2006, 16h47
  4. Réponses: 15
    Dernier message: 24/02/2006, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo