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

Langage PHP Discussion :

Suppression d'accents


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut Suppression d'accents
    Bonjour à tous !

    Je récupère dans ma base de données un liste de saisons ("58 Eté 2013", "59 Hiver 2013").
    J'aimerais supprimer les accents. C'est à dire remplacer à par a, é par e, etc...

    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function stripAccents($string){
    return strtr($string,
    'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
    'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function stripAccents($string){
    $accent = array("à","á","â","ã","ä","ç","è","é","ê","ë","ì","í","î","ï","ñ","ò","ó","ô","õ","ö","ù","ú","û","ü","ý","ÿ","À","Á","Â","Ã","Ä","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ñ","Ò","Ó","Ô","Õ","Ö","Ù","Ú","Û","Ü","Ý");
    $sansAccent = array("a","a","a","a","a","c","e","e","e","e","i","i","i","i","n","o","o","o","o","o","u","u","u","u","y","y","A","A","A","A","A","C","E","E","E","E","I","I","I","I","N","O","O","O","O","O","U","U","U","U","Y");
    return str_replace($accent, $sansAccent, $string);
    }
    Mais aucunes de ces fonction ne marche

    J'ai à chaque fois mes é et mes à.....

    D'ou cela peut-il bien venir ?

    Merci de votre aide !

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Si ton système le supporte autant utiliser iconv qui fait cela très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sans_accent = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    Et pour ton problème c'est sans doute un souçis d'encodage des chaines à traiter
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Re-bonjour,

    Merci de ta réponse.

    Alors Iconv ne fonction pas avec les "Eté" qui sortent de ma base.
    J'ai mis mon charset en utf-8 (il était en iso-8859-1 avant), et les "é" s'affichent avec un point d'interrogation blanc sur un losange noir. (�)
    Je ne peut absolument pas toucher à la base, j'ai seulement droit a des select.

    Mon problème peut-il être réglé ?

  4. #4
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Bizar, ton code devrait marcher... Peut être ne nous montres-tu pas l'endroit qui pose problème dans ton code.

    Pour voir, essayes cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function propre($in)
    {
            $in = preg_replace("#\[.*\]#iU", "", $in);
    	$search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@');
    	$replace = array ('e','a','i','u','o','c','_','');
    	return preg_replace($search, $replace, $in);
    }
    Edit : tu as répondu pendant que j'écrivais. Les ? dans le losange, c'est caractéristique des problèmes d'encodage. Est-ce toi qui enregistre dans la base de données ?

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Le losange noir signifie que tu affiches de l'ANSI dans une page UTF8.

    Pour str_replace() il ne fonctionnera pas sur une chaîne UTF8.

    L'expression de Comode doit fonctionner mais il faudra peut être le modifieur "u" pour l'UNICODE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@u');
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Bon alors la fonction ne fonctionne pas.

    Et non ce n'est pas moi qui ai inséré dans la table.

    Je vais vous noter tous les codes concernés :

    Fonction qui récupère dans la table :
    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
    function getSaisons(){
     
    	global $connect;
     
    	$liste[0] = "";
    	$requete = "select codesaison as code, libsaison as lib
    				from saisons
    				where datedebutsaison > sysdate - 1825
    				and saisonpermanente = 0
    				or codesaison = 9
    				order by datedebutsaison desc";
     
    	$reponse = $connect->query($requete);
     
    	$i = 0;
    	while($res = $reponse->fetch(PDO::FETCH_BOTH)){
    		$liste[$i] = $res[0]." ".$res[1];
    		$i++;
    	}
     
    	$reponse->closeCursor();
     
    	return $liste;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $saisons = getSaisons();
    et l'affichage de la liste déroulante :
    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
    echo "Saisons : ";
    		echo "<form method='POST'>";
    		echo "<select name='saison'>";
    		$selected = "";
    		foreach($saisons as $saison){
    			$valeur = propre($saison);
    			if(isset($_SESSION['saison']) and $_SESSION['saison'] == $valeur)
    				$selected = "selected='selected'";
    			else
    				$selected = "";
    			echo "<option ".$selected.">".$valeur."</option>";
    		}
    		echo "</select>";
    		echo " <input type='submit' value='OK' name='OKR'>";
    		echo "</form>";
    L'entete de mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 5.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
        <head>
            <title>Portefeuille de commandes</title>
            <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
            <link href="vue/accueil/style.css" rel="stylesheet" type="text/css" />
    		<script type="text/javascript" src="vue/accueil/calendrier.js"></script>
        </head>
    Au lieu de "Eté 2013" il n'affiche rien, juste une ligne blanche.
    Au lieu de "Hiver 2013" il affiche "Hiver_2013".

    Je dois avouer que je suis un peu perdu avec tout ça :s

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Pour str_replace() il ne fonctionnera pas sur une chaîne UTF8.
    C'est inexact, str_replace() est notée comme "binary safe" et fonctionnera normalement sur les chaines utf-8 à la condition expresse que tous les paramètres soient parfaitement encodés utf-8.
    C'est la raison pour laquelle il n'y a pas de fonction mb_str_replace().

    Un peu de lecture par ici

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Pleure pas, j'ai moi-même été débutant comme toi

  10. #10
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    J'oserai te suggérer de remplacer la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<option ".$selected.">".$valeur."</option>";
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<option '.$selected.'>'.htmlentities($valeur).'</option>';
    je ne pense pas que ça résoudra ton problème, mais ça peut t'éviter d'autres problèmes du même style en convertissant les caractères spéciaux (y compris accentués) en caractères html. Par ailleurs, ça protège contre les attaques par injection de javascript.

    Pour ton problème, c'est effectivement étrange... Si les fonctions de conversion des caractères accentués ne marchent pas, c'est que ta base doit renvoyer un format exotique... Tu ne peux vraiment pas nous en dire plus sur cette base, parce que c'est là que doit être le soucis ?

  11. #11
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Qu'est ce que te retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo mb_detect_encoding($str);
    ?

    $str étant la chaine avec les accents que tu as besoin de "nettoyer"
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Bonjour !

    Bien dormi ?

    @Grunk : Quand j'utilise mb_detect_encoding, il me dit que la fonction n'est pas défini Oo

    @Comode : L'utilisation de htmlentities fait que toutes les chaines qui viennent de ma base de données qui comportent un accent, une cédille, ou autre ne s'affiche pas du tout

    Donc oui effectivement ça doit venir de la base de données.
    Je ne sais pas de quelles infos vous avez besoin, mais tous les champs qui posent problèmes sont varchar2 sur 30 ou 40 octets.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Je viens de voir que même les erreurs de la base de données mettent des � à la place des caractères spéciaux.
    Cela peut-il venir des paramètres de PHP ? Ou de IIS ? (oui pas apache pour moi ^^).

  14. #14
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Quelque soit l'encodage utilisé , il faut que tu vérifie qu'il soit identique :

    - Dans ta base de données (aussi appelé interclassement)
    - Dans la config de php (directive default_charset)
    - Dans les éventuelles <meta> de ton html
    - Dans l'encodage du fichier (c'est selon l'éditeur de texte)

    Quand j'utilise mb_detect_encoding, il me dit que la fonction n'est pas défini Oo
    Il faut activer l'extension php_mbstring qui est disponible par défaut avec php
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Merci de ta réponse !

    Comment puis-je vérifier l'interclassement dans la bdd ?

    Mon default_charset est à vide.

    Ma balise meta :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    Et l'encodage du fichier est en utf-8 (sans BOM).

    A priori ça doit être bon nan ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Et j'ai aussi fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($saisons as $saison){
    	echo mb_detect_encoding($saison)." / ".$saison."<br/>";
    }
    qui me donne ça :

    UTF-8 / 59 Et� 2014
    ASCII / 58 Hiver 2013
    UTF-8 / 57 Et� 2013
    ASCII / 56 Hiver 2012
    UTF-8 / 55 Et� 2012
    ASCII / 54 Hiver 2011
    UTF-8 / 53 Et� 2011
    ASCII / 52 Hiver 2010
    UTF-8 / 51 Et� 2010
    ASCII / 50 Hiver 2009
    UTF-8 / 49 Et� 2009
    ASCII / 9 PERMANENT

  17. #17
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    J'ai dit une connerie pour la bdd c'est pas l'interclassement qu'il faut vérifier mais le charset :
    Pour mysql, en ayant sélectionné la bonne bdd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW variables LIKE "character_set_database";
    Pour le défaut charset de PHP si tu ne traite que de l'utf8 , passe le à "utf-8"
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Hello !

    Quand je fais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW GLOBAL VARIABLES LIKE 'character_set_database'
    Il me dit instruction SQL non valide.

    En attendant, je met dans mes requetes :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    lower(CONVERT(CE_QUE_JE_VEUX, 'US7ASCII'))

    C'est pas très propre je pense, mais ça enlève les accents et je peux continuer au moins

  19. #19
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    La requête que je t'ai donné c'est
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW variables LIKE "character_set_database";

    pas de GLOBAL.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    C'est pareil, ça me met instruction SQL non valide.
    C'est pour ça que j'avais cherché un peu et que j'ai essayé avec GLOBALE.

    Mais toujours pas de résultats

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Suppression d'accents en UTF-8
    Par navis84 dans le forum Langage
    Réponses: 17
    Dernier message: 22/05/2023, 22h36
  2. [PHP 5.2] Suppression des accents
    Par lelectronique.com dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2009, 22h04
  3. suppression des accents dans un fichier sous csh
    Par zpipol dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 29/10/2008, 22h58
  4. Suppression des Accents
    Par Tanelorn dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 03/12/2007, 01h01
  5. Suppression des accents et mise en Majuscules
    Par mlzim dans le forum Contribuez
    Réponses: 4
    Dernier message: 07/11/2007, 12h07

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