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;
	}