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 en UTF-8


Sujet :

Langage PHP

  1. #1
    Membre averti
    Suppression d'accents en UTF-8
    Bonjour,

    Je récupère une variable POST donc le contenu possède des accents.
    Mes pages sont en UTF-8.

    J'aimerais utiliser cette fonction pour supprimer les accents :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	function supprime_accents($chaine)
    	{
    		$tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
    		$replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
    		return(strtr($chaine,$tofind,$replac));
    	}


    Mais au lieu de transformer le "é" en "e", elle le transforme en "n�"....

    Comment faire pour résoudre ce problème ?
    Merci d'avance !
    @+
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  2. #2
    Membre averti
    Peut-être cela est-il du à la fonction strtr(), car si j'utilise la fonction str_replace() les accents sont bien remplacés...

    Quelqu'un peut-t-il me confirmer cela ?
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  3. #3
    Expert éminent sénior
    Citation Envoyé par navis84
    Peut-être cela est-il du à la fonction strtr(), car si j'utilise la fonction str_replace() les accents sont bien remplacés...

    Quelqu'un peut-t-il me confirmer cela ?
    je confirme, strtr travaille directement sur les octet donc ce n'est pas facile à utiliser avec UTF-8
    par contre str_replace fonctionne très bien, voilà le code que j'utilise pour les minuscules
    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
    function minusculesSansAccents($texte)
    {
        $texte = mb_strtolower($texte, 'UTF-8');
        $texte = str_replace(
            array(
                'à', 'â', 'ä', 'á', 'ã', 'å',
                'î', 'ï', 'ì', 'í', 
                'ô', 'ö', 'ò', 'ó', 'õ', 'ø', 
                'ù', 'û', 'ü', 'ú', 
                'é', 'è', 'ê', 'ë', 
                'ç', 'ÿ', 'ñ', 
            ),
            array(
                'a', 'a', 'a', 'a', 'a', 'a', 
                'i', 'i', 'i', 'i', 
                'o', 'o', 'o', 'o', 'o', 'o', 
                'u', 'u', 'u', 'u', 
                'e', 'e', 'e', 'e', 
                'c', 'y', 'n', 
            ),
            $texte
        );
     
        return $texte;        
    }


    ensuite si tu as besoin de fonctions spéciales utilise les fonctions là :
    http://php.net/ref.mbstring

  4. #4
    Membre averti
    Super ! Ca fonctionne à merveille.

    Merci beaucoup !
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  5. #5
    Membre averti
    Bonjour,

    je viens de tester cette fonction sur un autre de mes scripts qui est lui aussi encodé en UTF-8... et au lieu de m'enlever les accents de certains caractères, la fonction me supprime carrément le caractère accentué...

    Auriez-vous une idée du pourquoi ?

    Merci d'avance !

    EDIT : je précise que la chaîne accentuée est issue d'un formulaire de page HTML, elle-même en UTF-8.

    EDIT 2 : j'ai ajouté l'encodage de la page avec le code ci-dessous et j'ai utilisé la fonction utf8_decode() pour ma chaîne de caractères.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    header("Content-Type: text/html; charset=UTF-8");
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  6. #6
    Membre chevronné
    Attention à ne pas confondre problèmes de conversion et problèmes d'affichage car ça arrive fréquemment. Je te conseille d'analyser directement caractère par caractère pour voir le résultat de tes manipulations et pour clarifier la situation.

    Etant donné qu'un caractère accentué en UTF8 est codé sur 2 bytes, tu peux facilement savoir si tu es en utf8 ou pas et si l'utilisation de l'utf8_decode s'avère nécessaire ou pas.

    Selon le brower, envoyer une entête utf8 fait que les données sont converties en UTF8 lorsqu'elles sont renvoyées vers le serveur mais le brower est capable de les décoder automatiquement, ce qui fait que si tu décodes une fois de plus la donnée dans ton script, il ne reçoit plus un contenu "utf8" et l'affichage commence à délirer.

    Donc moralité, le décodage n'est pas nécessaire sauf si tu désires exploiter ces données dans un autre contexte

  7. #7
    Membre averti
    Merci pour tes précisions.

    Ce n'est pas toujours évident de gérer ces encodages, et j'ai encore du mal à le faire.

    Ca viendra au fur et à mesure ! Merci !

    @+
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  8. #8
    Nouveau Candidat au Club
    le même mais avec les majuscules !
    Citation Envoyé par mathieu Voir le message
    je confirme, strtr travaille directement sur les octet donc ce n'est pas facile à utiliser avec UTF-8
    par contre str_replace fonctionne très bien, voilà le code que j'utilise pour les minuscules
    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
    function minusculesSansAccents($texte)
    {
        $texte = mb_strtolower($texte, 'UTF-8');
        $texte = str_replace(
            array(
                'à', 'â', 'ä', 'á', 'ã', 'å',
                'î', 'ï', 'ì', 'í', 
                'ô', 'ö', 'ò', 'ó', 'õ', 'ø', 
                'ù', 'û', 'ü', 'ú', 
                'é', 'è', 'ê', 'ë', 
                'ç', 'ÿ', 'ñ', 
            ),
            array(
                'a', 'a', 'a', 'a', 'a', 'a', 
                'i', 'i', 'i', 'i', 
                'o', 'o', 'o', 'o', 'o', 'o', 
                'u', 'u', 'u', 'u', 
                'e', 'e', 'e', 'e', 
                'c', 'y', 'n', 
            ),
            $texte
        );
     
        return $texte;        
    }


    ensuite si tu as besoin de fonctions spéciales utilise les fonctions là :
    http://php.net/ref.mbstring
    Ça ma bien aidé et comme je l'ai adapté à mon besoin, voici avec la gestion des majuscules :

    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
    32
    33
     
    	function stripAccents($texte) {
    		$texte = str_replace(
    			array(
    				'à', 'â', 'ä', 'á', 'ã', 'å',
    				'î', 'ï', 'ì', 'í', 
    				'ô', 'ö', 'ò', 'ó', 'õ', 'ø', 
    				'ù', 'û', 'ü', 'ú', 
    				'é', 'è', 'ê', 'ë', 
    				'ç', 'ÿ', 'ñ',
    				'À', 'Â', 'Ä', 'Á', 'Ã', 'Å',
    				'Î', 'Ï', 'Ì', 'Í', 
    				'Ô', 'Ö', 'Ò', 'Ó', 'Õ', 'Ø', 
    				'Ù', 'Û', 'Ü', 'Ú', 
    				'É', 'È', 'Ê', 'Ë', 
    				'Ç', 'Ÿ', 'Ñ', 
    			),
    			array(
    				'a', 'a', 'a', 'a', 'a', 'a', 
    				'i', 'i', 'i', 'i', 
    				'o', 'o', 'o', 'o', 'o', 'o', 
    				'u', 'u', 'u', 'u', 
    				'e', 'e', 'e', 'e', 
    				'c', 'y', 'n', 
    				'A', 'A', 'A', 'A', 'A', 'A', 
    				'I', 'I', 'I', 'I', 
    				'O', 'O', 'O', 'O', 'O', 'O', 
    				'U', 'U', 'U', 'U', 
    				'E', 'E', 'E', 'E', 
    				'C', 'Y', 'N', 
    			),$texte);
    		return $texte;
    	}

  9. #9
    Membre à l'essai
    Je pense que tu as depuis rectifié par toi même mais tu as deux erreur dans ta fonction:
    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
    32
    33
    	function stripAccents($texte) {
    		$texte = str_replace(
    			array(
    				'à', 'â', 'ä', 'á', 'ã', 'å',
    				'î', 'ï', 'ì', 'í', 
    				'ô', 'ö', 'ò', 'ó', 'õ', 'ø', 
    				'ù', 'û', 'ü', 'ú', 
    				'é', 'è', 'ê', 'ë', 
    				'ç', 'ÿ', 'ñ',
    				'À', 'Â', 'Ä', 'Á', 'Ã', 'Å',
    				'Î', 'Ï', 'Ì', 'Í', 
    				'Ô', 'Ö', 'Ò', 'Ó', 'Õ', 'Ø', 
    				'Ù', 'Û', 'Ü', 'Ú', 
    				'É', 'È', 'Ê', 'Ë', 
    				'Ç', 'Ÿ', 'Ñ', <= ici
    			),
    			array(
    				'a', 'a', 'a', 'a', 'a', 'a', 
    				'i', 'i', 'i', 'i', 
    				'o', 'o', 'o', 'o', 'o', 'o', 
    				'u', 'u', 'u', 'u', 
    				'e', 'e', 'e', 'e', 
    				'c', 'y', 'n', 
    				'A', 'A', 'A', 'A', 'A', 'A', 
    				'I', 'I', 'I', 'I', 
    				'O', 'O', 'O', 'O', 'O', 'O', 
    				'U', 'U', 'U', 'U', 
    				'E', 'E', 'E', 'E', 
    				'C', 'Y', 'N', <= et là !
    			),$texte);
    		return $texte;
    	}