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 :

Remplacer é par É


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut Remplacer é par É
    Bonjour,

    Je souhaite remplacer le premier caractère d'une phrase venant d'une table Mysql par une majuscule.

    La fonction ucfirst ($libelle) est parfaite et marche bien, sauf lorsque le première lettre est le caractère "é", que je voudrais bien remplacer en "É".

    C'est là que çà se corse, je teste le premier caractère en le récupérant par la fonction $tmp = substr($libelle, 0, 1) et en faisant echo $tmp je me retrouve avec un ? au centre d'un losange noir à la place du "é".

    Je ne peux donc pas remplacer car il n'est pas reconnu.

    Notez que je déclare dans mon script php UTF-8 et que tous mes affichages sont corrects.

    J'essaie en testant avec le chr(0233) qui correspond au "é", là j'ai une erreur php.

    Je voulais aussi essayer avec la fonction str_replace, mais celle ci prend en compte tous les caractères de la chaine, donc s'il y a d'autres "é" à l'intérieur, ils seront aussi remplacés.

    Voilà si vous avez La Solution, elle sera la bienvenue, merci d'avance.
    Théo

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    La plupart des fonctions de base pour la manipulation des chaînes de caractères ont été écrites pour des encodages de caractères sur un seul octet comme par exemple l'ISO-8859-1; donc pour elles un octet équivaut à un caractère. Mais avec un encodage comme l'UTF-8 les caractères peuvent être encodés sur plusieurs octets et c'est justement le cas du é. On parle à propos de l'UTF-8 d'encodage multibyte (byte = octet en anglais, à ne pas confondre avec bit: 8 bits = 1 octet).

    En UTF-8, le é est encodé sur deux octets: C3 A9. C'est pour cette raison que tu vois un ? lorsque tu essaies d'afficher substr('é', 0, 1) car cette fonction n'extrait pas la lettre é mais juste le premier octet de la séquence qui est censée le représenter, soit C3.

    PHP dispose d'une gamme de fonctions équivalentes préfixées par mb_ pour manipuler des chaînes multibytes. Il y a donc mb_substr, mb_strtolower, mb_strtoupper, etc. mais manque de bol, il n'y a pas de mb_ucfirst, cette fonction n'existe pas. Ce n'est pas grave car elle est facile à coder en utilisant les autres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function mb_ucfirst($str, $encoding = mb_internal_encoding()) {
        return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
    }
     
    echo mb_ucfirst('école', 'UTF-8'); // École
    À noter que toutes ces variantes multibytes des fonctions de manipulation de chaînes ont comme dernier paramètre à leur signature l'encodage utilisé. Ce paramètre est optionnel et comme il peut être fastidieux de le renseigner à chaque fois, il est possible de le fixer une bonne fois pour toutes en utilisant mb_internal_encoding() au préalable.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Merci de la réponse.

    J'ai repris le code mais function mb_ucfirst($str, $encoding = mb_internal_encoding()) me donne une erreur php, j'ai donc écrit simplement function mb_ucfirst($str, $encoding) et là pas d'erreur.

    Puis en faisant un echo $tmp après $tmp = mb_substr($libelle, 0, 1) il s'affiche bien "é".

    Mais quand je fais if ($tmp = "é") mb_ucfirst($libelle, 'UTF-8'); j'ai toujours "é" d'affiché, il ne passe pas en "É"

    Merci d'avance d'une solution.
    Cordialement.
    Theo

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Autant pour moi, on ne peut pas prédéfinir un paramètre avec le résultat d'une fonction, il faut obligatoirement un expression constante. Donc en version corrigée ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function mb_ucfirst($str, $encoding = null) {
        if (!$encoding) $encoding = mb_internal_encoding();
        return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
    }
     
    echo mb_ucfirst('école', 'UTF-8'); // École
    // ou
    mb_internal_encoding('UTF-8');
    echo mb_ucfirst('école'); // École
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Nickel, Saucisse cosmique, comme d'habitude, j'achète !

    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
    34
    35
    36
    37
    38
    39
    <?php
    //dans une class Tool
    class Tool{
      public function mb_ucfirst($str, $encoding = null) {
          if (!$encoding) $encoding = mb_internal_encoding();
          return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
      }
    }
    $tool=new Tool();
    mb_internal_encoding('UTF-8');
    $mots=array();
    $mots[]='à faire';
    $mots[]='éric';
    $mots[]='ça';
    $mots[]='ère';
    $mots[]='île';
    $mots[]='saucisson';
    $mots[]='patricia';
    $mots[]='féodor';
    $mots_initiales=array();
    foreach($mots as $mot){
      $mots_initiales[]= $tool->mb_ucfirst($mot); 
    }
    echo '<pre>';
    print_r($mots_initiales);
    echo '</pre>';
    /*
    Array
    (
        [0] => À faire
        [1] => Éric
        [2] => Ça
        [3] => Ère
        [4] => Île
        [5] => Saucisson
        [6] => Patricia
        [7] => Féodor
    )
    */
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Bonjour et merci des réponses.

    Je veux faire plus simple car je connais mal la programmation objet.

    Avec "études" dans $libelle, j'ai fait $tmp = mb_substr($libelle, 0, 1) puis echo $tmp et j'affiche bien "é".

    Puis j'ai fait un test sur $tmp (if ($tmp = "é") $libelle = "É".substr($libelle, 1);Indépendamment "É".substr($libelle, 1) m'affiche bien Études etc mais c'est le test qui ne marche pas.

    J'ai bien "é" dans $tmp mais quand je le teste if ($tmp = "é") il ne passe pas !!

    Que faut il rajouter à ce test pour prendre en compte le "é" ?

    Merci d'avance

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Merci de ton soutien Dendrite!

    Citation Envoyé par theo16
    Mais quand je fais if ($tmp = "é") mb_ucfirst($libelle, 'UTF-8'); j'ai toujours "é" d'affiché, il ne passe pas en "É"
    Citation Envoyé par theo16
    J'ai bien "é" dans $tmp mais quand je le teste --if ($tmp = "é")-- il ne passe pas !!
    Toi tu mérites l'émoticône fouettemi fouettemoi sont dans un bateau (au minimum):
    • Pour ce que tu veux faire, ta variable $tmp ne sert pas. On se fiche de savoir si le premier caractère est minuscule ou pas, on applique la fonction (celle de mon précédent poste). Si le premier caractère est en minuscule elle le transforme en majuscule, et s'il est déjà en majuscule et bah tant pis, elle ne le change pas.
    • if ($tmp = "é"): le = est un opérateur d'affectation pas de comparaison. Pour tester une égalité on utilise == ou bien === si on veut tester en plus le type des variables.
    • Pieta signore, Signore pieta, utilise les balises code du forum pour formater ton code (code ou c si c'est sur une ligne)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    En employant la fonction pour affecter ma variable $libelle, çà marche, merci beaucoup.

    Bonne journée et bonne fête de fin d'année.
    Cordialement.
    Theo

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

Discussions similaires

  1. Accents remplacés par des ? durant l'écriture
    Par mona dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/01/2006, 14h13
  2. Trouver ' et remplacer par \' dans une chaîne
    Par micatmidog dans le forum Général Python
    Réponses: 9
    Dernier message: 23/12/2005, 16h09
  3. impossible de remplacer "-" par "_"
    Par fabrice1596 dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2005, 11h31
  4. [XSLT] Remplacer par des caractères spéciaux
    Par OXyGN dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/07/2005, 17h30
  5. [JSTL] Mes variables ne sont pas remplacées par leur valeur
    Par thomine dans le forum Taglibs
    Réponses: 9
    Dernier message: 18/03/2005, 10h00

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