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 :

Une boucle de parcours par caractère [Encodage]


Sujet :

Langage PHP

  1. #1
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut Une boucle de parcours par caractère
    Bonjour à toutes et à tous,

    j'ai un soucis d'encodage de caractère qui survient et dont je n'arrive pas à me dépatouiller...
    Voici le code en question :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $texte = "Tronçon";
    for($i = 0; $i < mb_strlen($texte,"utf-8"); $i++)
    	echo "{$texte[$i]}<br />";
    Le 'ç' est remplacé par deux caractères '?' (sur fond de losange noir) et donc le 'n' n'est pas affiché...
    A noter que l'affichage direct de la variable ne pose pas de problème : Le texte est en brut dans le fichier, il ne provient pas d'une source de données externe.
    A noter aussi que le problème ne vient pas de mb_strlen() car le code suivant donne le même résultat :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $texte = "Tronçon";
    for($i = 0; $i < 7; $i++)
    	echo "{$texte[$i]}<br />";

    Quelques informations sur mon environnement de travail :
    - fichier enregistré en utf-8
    - header HTML utf-8 :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    - header requête HTTP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    header("Content-Type: text/html; charset=utf-8");
    - charset serveur :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_internal_encoding("utf-8");

    Quelqu'un aurait une idée ?

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    SpaceFrog m'a proposé une solution qui fonctionne sur le chat.
    Il semblerait que PHP ne sache pas split des chaînes de caractères correctement autrement qu'avec un format iso.

    Voici donc la correction :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $texte = mb_convert_encoding("Tronçon $id_troncon","ISO-8859-1","UTF-8");
    for($i = 0; $i < strlen($texte); $i++)
    	echo utf8_encode($texte[$i])."<br />";
    On peut aussi pour optimiser passer par iconv, je ne l'ai pas fait pour ma part car je ne l'ai pas d'installé.
    iconv propose la même chose que mb mais est plus rapide.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    $texte[$i] est toujours lu en iso c'est le cœur de PHP qui est comme ça

    EDIT : je te conseil pas de convertir la chaine tu risques de perdre des caractère, fait un substr plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $str = 'héhé';
     
    for($i = 0; $i < mb_strlen($str, 'UTF-8'); ++$i)
    {
        echo mb_substr($str, $i, 1, 'UTF-8'), "\n";
    }

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Merci pour cette réponse stealth35, elle fonctionne aussi mais surtout nécessite moins de conversion.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    si tu veux faire en classique sans passer par des fonctions tu peux faire :

    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
    $str = 'héhé';
    $len = strlen($str);
     
    for($i = 0; $i < $len; ++$i)
    {
        $out = $str[$i];
     
        if(ord($out) > 128)
        {
            ++$i;
            $out .= $str[$i];
        }
     
        if(ord($out) > 224)
        {
            ++$i;
            $out .= $str[$i];
        }
     
        if(ord($out) > 240)
        {
            ++$i;
            $out .= $str[$i];
        }
     
        var_dump($out);
    }
    ou pour le fun :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    class String implements ArrayAccess, Countable
    {
        private $_str;
        private $_store;
     
        public function __construct($str)
        {
            $this->_str = (string) $str;
            $this->_store = str_split($this->_str);
     
            foreach($this->_store as $index => &$chr)
            {    
                if(ord($chr) > 128)
                {
                    $chr .= $this->_store[$index + 1];
                    unset($this->_store[$index + 1]);
                }
     
                if(ord($chr) > 224)
                {
                    $chr .= $this->_store[$index + 2];
                    unset($this->_store[$index + 2]);
                }
     
                if(ord($chr) > 240)
                {
                    $chr .= $this->_store[$index + 3];
                    unset($this->_store[$index + 3]);
                }            
            }
     
            $this->_store = array_values($this->_store);
        }
     
        public function offsetExists($offset)
        {
            return isset($this->_store[$offset]);
        }
     
        public function offsetGet($offset)
        {        
            return $this->_store[$offset];
        }
     
        public function offsetSet($offset, $value)
        {
            $this->_store[$offset] = $value;
        }
     
        public function offsetUnset($offset)
        {
            unset($this->_store[$offset]);
        }
     
        public function count()
        {
            return count($this->_store);
        }
     
        public function __toString()
        {
            return implode($this->_store);
        }
    }
     
    $str = new String('héhé');
    echo $str[1];

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

Discussions similaires

  1. [XL-2010] Interrompre une boucle Do While par un événement extérieur
    Par Silvanos dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/02/2013, 11h47
  2. Réponses: 2
    Dernier message: 26/11/2012, 15h45
  3. Réponses: 7
    Dernier message: 16/10/2010, 15h48
  4. erreur 1010 sur une boucle qui parcoure un tableau
    Par pakkun dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 14/10/2008, 15h55
  5. Sortir d'une boucle de parcour d'un Recordset
    Par Mariboo dans le forum IHM
    Réponses: 2
    Dernier message: 12/06/2006, 18h07

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