Domanda

ottengo file di immagini che hanno caratteri Repubblica nel nome del file (ad esempio, ěščřžýáíé) e voglio rinominarli, senza gli accenti in modo che siano più compatibili per il web. Ho pensato che avrei potuto utilizzare una semplice funzione str_replace ma non sembra funzionare lo stesso con la matrice file come si fa con una stringa letterale.

Ho letto i file con readdir, dopo aver controllato per l'estensione.

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

Output

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"

In questo momento sto in esecuzione su WAMP, ma le risposte che funzionano su piattaforme sono ancora meglio:)

È stato utile?

Soluzione

Secondo i segni 0xFFFD (che appare in Firefox come diamanti con un punto interrogativo all'interno) già non state leggendo utilizzando la codifica corretta (che sarebbe Unicode / UTF-8). Per quanto ho trovato questo bug , sembra essere correlato.

Ecco un altro SO argomento a tale proposito: problema php readdir con la lingua giapponese nome del file

Al punto, attendere fino a quando ottengono php6 stabile e quindi utilizzarlo.

non collegati al problema: il normalizzatore è uno strumento migliore per ottenere liberarsi di segni diacritici .

Altri suggerimenti

Se funziona con le stringhe, ma non con gli array, solo lo applica sulle stringhe: -)

$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]);

str_replace accettare array solo per le prime 2 params , e non l'ultimo. Posso sbagliarmi, ma in ogni caso questo dovrebbe funzionare.

Se con qualsiasi mezzo, si dispone di un vero e proprio problema di codifica, potrebbe essere solo che voi OS utilizzano un singolo byte di codifica mentre il file sorgente usare un altro, probabilmente UTF-8.

In questo caso, fare qualcosa di simile:

$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 () richiedono l'ext / estensione mbstring e iconv () richiedono ext / iconv.

Non direttamente una risposta alla tua domanda forse, ma si potrebbe desiderare di dare un'occhiata al funzione iconv() in PHP e più in particulare l'opzione //TRANSLIT che è possibile aggiungere al secondo argomento. Ho usato più volte girando francesi e orientali stringhe europa alle loro controparti amichevoli a-z e URL.

Da PHP.net ( http://www.php.net/ manuale / it / function.iconv.php )

  

Se si aggiunge la stringa // Translit a out_charset traslitterazione è attivato. Ciò significa che quando un personaggio non può essere rappresentato nel set di caratteri di destinazione, può essere approssimata attraverso uno o più caratteri in modo simile alla ricerca.

Il codice sorgente (e la stringa di prova) sembrano essere in utf8, mentre i nomi dei file sembrano utilizzare una codifica a byte singolo. Io suggerirei di usare la stessa codifica per la stringa di sostituzione. Per evitare problemi di codifica fonte, sarebbe meglio scrivere caratteri accentati nel codice in una forma esagonale (come \ xE8 per "c", ecc).

Così ho preso a lavorare sul mio sistema Windows XP da questo

$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]);
  }
}

Non so se è un conincidence o no, ma spettacoli chiamando mb_get_info()

[internal_encoding] => ISO-8859-1

Questa è un'altra funzione che ho trovato utile sulla pagina 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;
}
?>

In sostanza, non è stato un problema per convertire i caratteri europei a un equivilent ascii, ma sono riuscito a trovare alcun modo affidabile per rinominare i file (ad esempio, i file di riferimento con caratteri non-ASCII).

Per UTF-8 uso la funzione PHP utf8_encode. Microsoft Windows utilizza ISO-8859-1 quindi in questo caso una conversione è necessaria.

Esempio - l'elenco dei file in una directory:

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

Area5one ha ragione -. Si tratta di un problema di codifica diverso

Quando ho aggiornato la mia macchina da XP a Win7, ho anche aggiornato la mia versione di MySQL e PHP. Da qualche parte lungo la strada, i programmi PHP che utilizzate per il lavoro ha smesso di funzionare. In particolare, scandir, readdir e utf-8 avevano vissuto felici insieme, ma non più.

Quindi, ho modificato il mio codice. Variabili relative ai dati presi dalla fine del disco rigido in "_ISO" per reflecct codifica ISO-8859-1 Windows', i dati del database MySQL va nelle variabili che terminano in '_utf'. Così, il codice da area5one vorrebbe questo:     $ Dir_handle_iso = opendir ( "");     while (falso! == ($ file_iso = readdir ($ dir_handle_iso)))     {     $ File_utf = utf8_encode ($ file);     ...     }

Questo funziona per me al 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"); Ha lavorato per me (Windows, personaggi danesi).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top