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 :

Accents et encodage sur une chaîne de caractères venant d'une lecture de répertoire


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut Accents et encodage sur une chaîne de caractères venant d'une lecture de répertoire
    Salut à tous!

    Bon j'ai un problème qui commence a me taper méchament sur les nerfs:
    La problèmatique est pourtant pas bien compliquée, il s'agit de lire le contenu d'un repertoire, et d'enlever les accents des noms de fichiers récupérés.

    Je bosse sous windows, avec PHP5.3.0, sans serveur web (directement en console)

    Voila mon code :

    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
     
    $rep=@opendir($zipname);
    $cpt_si=0;
      while($file=@readdir($rep))
      {
        foreach($array_fic as $key => $value)
        {
          echo $key." : ".$file." :: ".strpos(strtolower(self::text_remove_accents($file)),$key)." :: ".self::text_remove_accents($file)."\n";
     
          if(strpos(strtolower(self::text_remove_accents($file)),$key) !== FALSE){
          //variable témoin à 1: le fichier a été trouvé
          $array_fic[$key]=1;
          $array_fic_name[$key]=$file;
        }
      }
      echo "\n\n";
     
      if(in_array(strtoupper(self::text_remove_accents($file[0])), $array_fic_si,    FALSE)){
      //variable témoin à 1: le fichier a été trouvé
      $cpt_si++;
      $array_fic_name['si']=$file;
      }
    }
    @closedir($rep);
    Bon donc le machin parcours le répertoire et pour chaque fichier essaye de déterminer si une partie du nom se trouve dans un tableau $array_fic. Pour le cas de la clef 'si', On teste la premiere lettre du fichier. Après ca il met des variable témoin a 1 ect.

    Bon le problème c'est que j'ai une clef "electrique" et que quand "électrique" est dans le nom de fichier, strpos ne me renvoie rien, malgrès l'utilisation de la méthode text_remove_accents.

    L'echo fait au dessus me confirme que text_remove_accents n'a pas remplacé l'accent d'électrique. Pourtant cette fonction marche très bien aux xx endroits ou je l'ai déja utilisé. D'ailleur si je fai echo self::text_remove_accents("éèèéèéààà") ca m'affiche 'eeeeeeaaa', enfin je la met quand meme en fin de post des fois que.

    Un problème d'encodage me suije dis. un test avec ma fonction seems utf8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    					if(self::text_seems_utf8($file))echo "UTF8\n";
    					else echo "NONUTF8\n";
    Suprise, les nom de fichiers sans accents sont détectées comme étant utf8, et les autres comme n'étant pas de l'utf8.
    Si je converti en utf8 avec iconv(), ca m'affiche du n'importe quoi sur les caractères accentués.

    Donc je vois pas, il doit quand meme etre possible de supprimer ces accents! A noter que le répertoire et les fichiers viennent d'être extraits d'une archive (ZipArchive::ExtractTo)

    Quelqu'un aurait une idée? Je deviens fou avec ce machin!

    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    public function text_seems_utf8($Str)
    	{
    		for ($i=0; $i<strlen($Str); $i++) {
    			if (ord($Str[$i]) < 0x80) continue;
    			elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
    			elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
    			elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
    			elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
    			elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
    			else return false;
    			for ($j=0; $j<$n; $j++) {
    				if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
    				return false;
    			}
    		}
    		return true;
    	}
     
    	/*Virer les accents d'un texte, en détectant quel type dencodage*/
    	function text_remove_accents($string)
    	{
    	  if (self::text_seems_utf8($string)) {
    		  $chars = array(
    			chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
    			chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
    			chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
    			chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
    			chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
    			chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
    			chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
    			chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
    			chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
    			chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
    			chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
    			chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
    			chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
    			chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
    			chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
    			chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
    			chr(195).chr(167) => 'c', chr(195).chr(168) => 'e',
    			chr(195).chr(169) => 'e', chr(195).chr(170) => 'e',
    			chr(195).chr(171) => 'e', chr(195).chr(172) => 'i',
    			chr(195).chr(173) => 'i', chr(195).chr(174) => 'i',
    			chr(195).chr(175) => 'i', chr(195).chr(177) => 'n',
    			chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
    			chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
    			chr(195).chr(182) => 'o', chr(195).chr(182) => 'o',
    			chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
    			chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
    			chr(195).chr(189) => 'y', chr(195).chr(191) => 'y',
    			chr(197).chr(146) => 'OE', chr(197).chr(147) => 'oe',
    			chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
    			chr(197).chr(189) => 'Z', chr(197).chr(190) => 'z',
    			chr(226).chr(130).chr(172) => 'E');
     
    		  $string = strtr($string, $chars);
    	  } else {
    		  // Assume ISO-8859-1 if not UTF-8
    		  $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
    			  .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
    			  .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
    			  .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
    			  .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
    			  .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
    			  .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
    			  .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
    			  .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
    			  .chr(252).chr(253).chr(255);
     
    		  $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
     
    		  $string = strtr($string, $chars['in'], $chars['out']);
    		  $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
    		  $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
    		  $string = str_replace($double_chars['in'], $double_chars['out'], $string);
    	  }
    	  return $string;
    	}

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    es-tu certain de ton encodage ? l'encodage de la fenetre de commande windows (cmd) n'est ni en ISO ni en UTF8...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: text/html; charset=cp850');

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Yep, encodage je sais pas...

    J'ai ajouté le header en début de script et ca ne change rien, en même temps ma fonction n'est pas prévue pour remplacer des accents en cp850...

    En fait la question c'est en quoi est encodé le nom de fichier que je récupère. Si c'est du cp850, il me faut la fonction de remplacement d'accents qui va bien pour le cp850...

    Ceci dis, c'est pas pour la sortie ca plutot? Il PHP il s'en balance d'etre en console jusqu'au moment de l'affichage non?
    Donc la logique voudrait qu'il s'execute, me récupère les nom de fichiers, fasse les comparaisons avec de l'utf-8, et qu'il affiche n'importe quoi, l'utf8 ne passant pas dans la console. or le strpos ne marche pas...
    je me trompe ou?

    Ces trois machins doivent également jouer un role:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iconv_set_encoding("internal_encoding", "UTF-8");
    iconv_set_encoding("output_encoding", "UTF-8");
    iconv_set_encoding("input_encoding", "UTF-8");
    J'ai essayé plusieurs combinaisons (commentées, décommentées, ISO, UTF-8....) sans succès...

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    le charset joue...

    petit test effectué chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $file = "fichier_aux_caractères_accentués.txt";
    if (is_file($file)) {
    	echo $file." est un fichier";
    } else {
    	echo $file." n'est pas reconnu";
    }
    ?>
    Ce bout de code, sans header prendra des headers par défaut en ISO... on est bien d'accord ?

    Et bien, ce code enregistré en UTF-8 renvoie "n'est pas reconnu" alors qu'enregistré en ISO il dit bien que $file est un fichier

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Ouaip, sauf que tu définis ta chaine dans ton fichier php, pour ca moi non plus pas de problème...

    Regarde petit test avec mon fichier php encodé en utf8, et le charset en utf8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo strtolower(self::text_remove_accents("00000023B1_BISCARROSSE_FT_Controle_Périodique_électriques_140409XLS.xls"));
    m'affiche 00000023b1_biscarrosse_ft_controle_periodique_electriques_140409xls.xls
    Donc pas de pb.

    mais si cette chaine est récupérée avec $file=readdir($rep),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo strtolower(self::text_remove_accents($file));
    me renvoie 00000023b1_biscarrosse_ft_controle_périodique_électriques_140409xls.xls

    D'ou la question de savoir ce que magouille readdir() avec l'encodage, pour que $file ne soit ni en utf8 ni en iso!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Okay t'avais raison mon pote!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strpos(strtolower(self::text_remove_accents(iconv("cp850","utf-8",$file))),$key)
    Me file bien la position du "electrique" et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self::text_remove_accents(iconv("cp850","utf-8",$file))
    me renvoie bien la chaine sans accents...

    Donc j'en débuit que l'environement défini le charset pour les entrées... en tout cas avec readdir...

    Je pensais que cp850 ne concernait que la sortie du script, m'enfin.

    en tout cas merci bien, je vais essayer d'arranger ca avec les params iconc_set()...

    Ca reste bien flou pour moi ces affaires d'encodage...

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 22/10/2012, 12h08
  2. Réponses: 3
    Dernier message: 25/11/2008, 18h36
  3. Réponses: 0
    Dernier message: 06/10/2008, 21h55
  4. Réponses: 2
    Dernier message: 08/07/2008, 11h50
  5. Réponses: 2
    Dernier message: 13/06/2008, 10h21

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