Comparaison entre chaine de caractères et encodage

Eléphanteau du PHP | 41 Messages

25 août 2012, 19:01

Bonjour,

J'ai un soucis étonnant avec la comparaison de string.
Je commence par télécharger un CSV depuis un site, puis je le lis en faisant un explode de cette manière :

Code : Tout sélectionner

//ouverture $handle = @fopen($tmp, "r"); if ($handle) { while (($ligne = fgets($handle, 4096)) !== false) { $cases=preg_split("#;|\t#",utf8_encode($ligne));
Ensuite j'essaye de repérer une case :

Code : Tout sélectionner

$contenuCase=mb_strtolower(trim($cases[$i]), 'UTF-8'); if($contenuCase=='repère 1') ...
Mon soucis est que ça ne marche pas et pourtant quand j'écris $contenuCase sur ma page, je texte est bien strictement 'repère 1' à un moment, pourtant je ne passe pas dans le IF.

Ce problème m'étonne beaucoup. J'ai aussi essayé $contenuCase==='repère 1' et strcmp($contenuCase,'repère 1') pour la comparaison mais rien n'y fait.
Avez vous une idée d'où vient ce problème ?

Invité
Invité n'ayant pas de compte PHPfrance

26 août 2012, 17:49

Bonjour,
if($contenuCase==utf8_encode('repère 1')) ...

???

Eléphanteau du PHP | 41 Messages

26 août 2012, 17:51

déjà essayé et ça ne marche pas

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 août 2012, 14:19

salut,

as tu essayé http://fr.php.net/manual/fr/function.mb-ereg.php ?

pour info tu peux simplifier ton code avec http://www.php.net/file et str_getcsv

+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 41 Messages

27 août 2012, 20:41

Ca avait l'air d'une super idée, mais c'est dingue ça ne marche toujours pas
Pour info lorsque je fais un mb_detect_encoding sur $contenuCase ça me met la plupart du temps du UTF-8.
Quand $contenuCase à la valeur "mot clé", strlen($contenuCase) retourne 14 alors que strlen('mot clé') retourne 8

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 août 2012, 20:55

mb_strlen pas strl_len

ton fichier il est bien en utf-8 ? (le ficher php pas le fichier csv)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 41 Messages

27 août 2012, 22:29

Je viens d'ajouter header('Content-Type: text/html; charset=utf-8'); en haut de mon fichier pour être sûr mais j'avais déjà <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> dans le html. Ca n'a rien changé. J'ai remplacé strlen par mb_strlen mais le résultat est identique

Eléphanteau du PHP | 41 Messages

27 août 2012, 22:50

j'ai executé le code suivant :

Code : Tout sélectionner

for($k=0;$k<strlen($contenuCase);$k++) echo $contenuCase[$k].':';
Voici le résultat : m::o::t:: ::c::l::�:�:
C'est bizarre on dirait qu'un caractère sur deux est "nul" et il y a une spécificité pour les caractères spéciaux

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 août 2012, 00:04

strlen ne travail qu'avec de l'iso ! donc a oublier la


ajouter un header ne sert à rien (a part envoyer un charset dans l'entête http)

vue l'affichage sur le forum tu as un soucis d'encodage mais du fichier lui même.

avec ton editeur de texte préféré (sauf word / openoffice et truc du genre) vérifie l'encodage du fichier (par exemple avec notepad++ tout simplement avec le menu encodage, choisis utf-8 sans BOM)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 41 Messages

28 août 2012, 01:47

Mauvaise nouvelle c'est déjà en UTF8 sans BOM
Je pense que ça viens plutot du problème des une sur deux fois où le caractère est nul. De toute manière en ce qui me concerce strlen($contenuCase) = mb_strlen($contenuCase) dans ce cas. Mais je note que c'est à éviter