Page 1 sur 1
Comparaison entre chaine de caractères et encodage
Posté : 25 août 2012, 19:01
par Ceubex
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 ?
Re: Comparaison entre chaine de caractères et encodage
Posté : 26 août 2012, 17:49
par Invité
Bonjour,
if($contenuCase==utf8_encode('repère 1')) ...
???
Re: Comparaison entre chaine de caractères et encodage
Posté : 26 août 2012, 17:51
par Ceubex
déjà essayé et ça ne marche pas
Re: Comparaison entre chaine de caractères et encodage
Posté : 27 août 2012, 14:19
par moogli
Re: Comparaison entre chaine de caractères et encodage
Posté : 27 août 2012, 20:41
par Ceubex
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
Re: Comparaison entre chaine de caractères et encodage
Posté : 27 août 2012, 20:55
par moogli
mb_strlen pas strl_len
ton fichier il est bien en utf-8 ? (le ficher php pas le fichier csv)
@+
Re: Comparaison entre chaine de caractères et encodage
Posté : 27 août 2012, 22:29
par Ceubex
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
Re: Comparaison entre chaine de caractères et encodage
Posté : 27 août 2012, 22:50
par Ceubex
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:

: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
Re: Comparaison entre chaine de caractères et encodage
Posté : 28 août 2012, 00:04
par moogli
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)
@+
Re: Comparaison entre chaine de caractères et encodage
Posté : 28 août 2012, 01:47
par Ceubex
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