Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/04/2011, 11h17   #1
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 :
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 :
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 :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- header requête HTTP :
Code php :
header("Content-Type: text/html; charset=utf-8");
- charset serveur :
Code php :
mb_internal_encoding("utf-8");

Quelqu'un aurait une idée ?
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 11h44   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 :
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.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/04/2011, 11h45   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
$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 :
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";
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/04/2011, 12h56   #4
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Merci pour cette réponse stealth35, elle fonctionne aussi mais surtout nécessite moins de conversion.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 13h42   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
si tu veux faire en classique sans passer par des fonctions tu peux faire :

Code :
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 :
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];
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h34.


 
 
 
 
Partenaires

Hébergement Web