Question

Je reçois des fichiers images qui ont des caractères tchèques dans le nom de fichier (par exemple, ěščřžýáíé) et je veux les renommer sans les accents afin qu'ils soient plus compatibles pour le web. Je pensais que je pouvais utiliser une simple fonction str_replace, mais il ne semble pas fonctionner même avec le tableau de fichier comme il le fait avec une chaîne littérale.

Je lis les fichiers avec readdir, après avoir vérifié l'extension.

function readFiles($dir, $ext = false) {
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                if($ext){  
                    if(end(explode('.', $file)) == $ext) {
                        $f[] = $file;
                    }
                } else {
                    $f[] = $file;
                }
            }

            closedir($dh);
            return $f;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

$files = readFiles(".", "jpg");

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$string = "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší";
$safe_string = str_replace($search, $replace, $string);

echo '<pre>';

foreach($files as $fl) {
    $safe_files[] = str_replace($search, $replace, $fl);
}

var_dump($files);
var_dump($safe_files);

var_dump($string);
var_dump($safe_string);

echo '</pre>';

Sortie

array(6) {
  [0]=>
  string(21) "Hl�vka s listem01.jpg"
  [1]=>
  string(23) "Hl�vky v atelieru02.jpg"
  [2]=>
  string(17) "Jarn� v�hon03.jpg"
  [3]=>
  string(17) "Mlad� chmel04.jpg"
  [4]=>
  string(23) "Stavba chmelnice 05.jpg"
  [5]=>
  string(21) "Zimni chmelnice06.jpg"
}
array(6) {
  [0]=>
  string(21) "Hl�vka-s-listem01.jpg"
  [1]=>
  string(23) "Hl�vky-v-atelieru02.jpg"
  [2]=>
  string(17) "Jarn�-v�hon03.jpg"
  [3]=>
  string(17) "Mlad�-chmel04.jpg"
  [4]=>
  string(23) "Stavba-chmelnice-05.jpg"
  [5]=>
  string(21) "Zimni-chmelnice06.jpg"
}
string(53) "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší"
string(38) "cseayisdjksnalci-saseeealskcnkkjy+eesi"

En ce moment je suis en cours d'exécution sur WAMP mais les réponses qui fonctionnent sur les plates-formes sont encore mieux:)

Était-ce utile?

La solution

Selon les marques 0xFFFD (qui apparaît dans Firefox comme des diamants avec un point d'interrogation à l'intérieur) vous êtes déjà pas les lire en utilisant le codage correct (ce qui serait Unicode / UTF-8). En ce que j'ai trouvé cette , il semble être lié.

Voici un autre sujet SO à ce sujet: problème php readdir avec la langue japonaise nom de fichier

Au point, attendre jusqu'à ce qu'ils obtiennent PHP6 stable, puis l'utiliser.

Rien à voir avec le problème: Normalizer est un meilleur outil pour obtenir débarrasser de marques diacritiques .

Autres conseils

Si cela fonctionne avec des chaînes, mais pas avec les tableaux, juste l'applique sur les chaînes: -)

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

len = count($safe_files)

for ($i=0; $i<len; $i++)
    $safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);

Je pense que str_replace accepter que des tableaux pour les 2 premiers params , et non la dernière. Je peux me tromper, mais de toute façon cela devrait fonctionner.

Si par tout moyen, vous avez un vrai problème d'encodage, il pourrait simplement être que vous OS utilise un codage d'un seul octet alors que votre fichier source utiliser un autre, probablement UTF-8.

Dans ce cas, faire quelque chose comme:

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$code_encoding = "UTF-8"; // this is my guess, but put whatever is yours
$os_encoding = "CP-1250"; // this is my guess, but put whatever is yours

len = count($safe_files)

for ($i=0; $i<len; $i++)
{
    $safe_files[$i] = iconv($os_encoding , $code_encoding, $safe_files[$i]); // convert before replace
    /*
     ALternatively :
     $safe_files[$i] = mb_convert_encoding($safe_files[$i], $code_encoding , $os_encoding );
    */
    $safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);
}

mb_convert_encoding () nécessitent l'extension ext / mbstring et iconv () exiger ext / iconv.

Pas directement une réponse à votre question peut-être, mais vous pouvez jeter un oeil à la page iconv() fonction en PHP et plus culièrement l'option //TRANSLIT que vous pouvez ajouter au second argument. Je l'ai utilisé plusieurs fois tourner les chaînes françaises et l'Europe de l'Est à leurs homologues amies a-z et url.

De PHP.net ( http://www.php.net/ manuel / fr / function.iconv.php )

  

Si vous ajoutez la chaîne // TRANSLIT à out_charset translittération est activée. Cela signifie que quand un personnage ne peut pas être représenté dans le jeu de caractères cible, il peut être approchée par un ou plusieurs caractères à la recherche de la même.

Votre code source (et la chaîne de test) semblent être en UTF8, tandis que les noms de fichiers semblent utiliser un codage sur un seul octet. Je vous suggère d'utiliser le même encodage pour votre chaîne de remplacement. Pour éviter les problèmes sources d'encodage, il vaut mieux écrire les caractères accentués dans votre code sous une forme hexagonale (comme \ XE8 pour « C », etc.).

Je l'ai eu à travailler sur mon système Windows XP par ce

$search = array('š','á','ž','í','e','é','r','n','ý','c',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$files = readFiles(".", "jpg");
$len = count($files);

for($i = 0; $i < $len; $i++){
  if(mb_check_encoding($files[$i], 'ASCII')){
    $safe_files[$i] = $files[$i];
  }else{
    $safe_files[$i] = str_replace(
        $search, $replace, iconv("iso-8859-1", "utf-8//TRANSLIT", $files[$i]));
  }
  if($files[$i] != $safe_files[$i]){
    rename($files[$i], $safe_files[$i]);
  }
}

Je ne sais pas si c'est un conincidence ou non, mais l'appel montre de mb_get_info()

[internal_encoding] => ISO-8859-1

Voici une autre fonction que j'ai trouvé sur la page strtr PHP

<?
// Windows-1250 to ASCII
// This function replace all Windows-1250 accent characters with
// thier non-accent ekvivalents. Useful for Czech and Slovak languages.

function win2ascii($str)    {   

$str = StrTr($str,
    "\xE1\xE8\xEF\xEC\xE9\xED\xF2",
    "\x61\x63\x64\x65\x65\x69\x6E");

$str = StrTr($str,
    "\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
    "\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");

$str = StrTr($str,
    "\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
    "\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");

$str = StrTr($str,
    "\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
    "\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");

return $str;
}
?>

En fait, il n'a pas été un problème pour convertir les caractères européens à une equivilent ascii, mais je ne pouvais trouver aucun moyen fiable de renommer les fichiers (par exemple, les fichiers de référence avec des caractères non-ascii).

Pour utiliser UTF-8 la fonction PHP utf8_encode. Microsoft Windows utilise ISO-8859-1 dans ce cas une conversion est nécessaire.

Exemple - liste des fichiers dans un répertoire:

<?php
$dir_handle = opendir(".");
while (false !== ($file = readdir($dir_handle)))
{
  echo utf8_encode($file)."<br>";
}
?>

Area5one a raison -. C'est un problème de codage différent

Quand je mis à jour ma machine de XP à Win7, je mis à jour aussi ma version de MySQL et PHP. Quelque part le long du chemin, les programmes PHP qui travaillait a cessé de fonctionner. En particulier, scandir, readdir et utf-8 avaient vécu heureux ensemble, mais pas plus.

Alors, je l'ai modifié mon code. Les variables relatives aux données prises à partir de la fin du disque dur dans « _iso » à reflecct ISO-8859-1 Windows encodage, les données de la base de données MySQL va dans les variables se terminant par « _utf ». Ainsi, le code de area5one aimerait ceci:     $ Dir_handle_iso = opendir ( "");     while (faux! == ($ file_iso = readdir (dir_handle_iso de $)))     {     $ File_utf = utf8_encode ($ file);     ...     }

Cela fonctionne pour moi 100%:

setlocale(LC_ALL,"cs_CZ");
$new_str = iconv("UTF-8","ASCII//TRANSLIT",$orig_str);

$ file = mb_convert_encoding ($ file, 'UTF-8', "iso-8859-1"); A travaillé pour moi (Windows, caractères danois).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top