Frage

bekomme ich Bilder-Dateien, die im Dateinamen Tschechische Zeichen (zB ěščřžýáíé) und ich möchte sie so ohne die Akzente benennen, dass sie mehr kompatibel für das Web sind. Ich dachte, ich eine einfache str_replace Funktion nutzen zu können, aber es scheint nicht das gleiche mit dem Datei-Array zu arbeiten, wie es mit einem Stringliteral der Fall ist.

lese ich die Dateien mit readdir, nachdem für die Erweiterung zu überprüfen.

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"

Im Moment bin ich auf WAMP laufen aber Antworten, dass die Arbeit auf allen Plattformen noch besser:)

War es hilfreich?

Lösung

Nach den 0xFFFD Marken (die mit einem Fragezeichen in in Firefox als Diamanten erscheinen) Sie bereits lesen sie nicht die richtige Codierung verwenden (die Unicode würde / UTF-8). Was fand ich dieses Fehler , es verwandt zu sein scheint.

Hier ist ein anderes SO Thema über dieses: php readdir Problem mit japanischer Sprache Dateiname

Auf den Punkt gebracht, warten, bis sie bekommen stabil PHP6 und dann verwenden.

kein Zusammenhang mit dem Problem: das Normalizer ist ein besseres Werkzeug zu bekommen befreien Sie sich von diakritische Zeichen .

Andere Tipps

Wenn es mit Strings arbeitet aber nicht mit Arrays, gilt es nur auf Strings: -)

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

ich glaube, str_replace Arrays nehmen nur für die 2 ersten params und nicht der letzte. Ich kann mich irren, aber trotzdem sollte diese Arbeit.

Wird durch Mittel, Sie eine echte Codierung Problem haben, könnte es nur sein, dass Sie ein einziges Byte-Codierung verwenden OS, während die Quelldatei verwenden eine andere, wahrscheinlich UTF-8.

In diesem Fall so etwas wie:

$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 () erfordern die ext / mbstring Erweiterung und iconv () erfordern ext / iconv.

Nicht direkt eine Antwort auf Ihre Frage vielleicht, aber Sie vielleicht einen Blick auf die iconv() Funktion in PHP und mehr in particulare die //TRANSLIT Option, dass Sie das zweite Argument anfügen können. Ich habe es mehrmals verwendet französisch und osteuropa Saiten ihrer a-z und URL freundliche Kollegen drehen.

Von PHP.net ( http://www.php.net/ manual / en / function.iconv.php )

  

Wenn Sie die Zeichenfolge // TRANSLIT zu out_charset Umschrift anhängen aktiviert ist. Dies bedeutet, dass, wenn ein Zeichen nicht in dem Zielzeichensatz dargestellt werden kann, kann es durch eine oder mehrere ähnlich aussehende Zeichen angenähert werden.

Ihr Quellcode (und der Test-String) erscheinen in UTF-8 sein, während der Dateinamen scheinen eine Single-Byte-Codierung zu verwenden. Ich würde vorschlagen, dass Sie die gleiche Codierung für Ihre Ersatzzeichenfolge verwenden. Um zu vermeiden, Quellencodierung Probleme, es wäre besser akzentuierten Zeichen in Ihrem Code in einer Hex-Form zu schreiben (wie \ xE8 für „C“ usw.).

So habe ich es auf meinem Windows XP-System arbeitet nach diesem

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

Ich weiß nicht, ob es ein conincidence ist oder nicht, sondern rufen mb_get_info() zeigt

[internal_encoding] => ISO-8859-1

Hier ist eine weitere Funktion, die ich hilfreich auf der PHP strtr Seite

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

Im Grunde war es nicht so ein Problem der europäischen Zeichen in ein ASCII-equivilent zu konvertieren, aber ich konnte keine zuverlässige Art und Weise finden, die Dateien (dh Referenzdateien mit Nicht-ASCII-Zeichen) umbenannt werden.

Für UTF-8 Verwendung der PHP-Funktion utf8_encode. Microsoft Windows verwendet ISO-8859-1 so in diesem Fall eine Konvertierung erforderlich ist.

Beispiel - die Auflistung der Dateien in einem Verzeichnis:

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

Area5one hat es richtig -. Es ist ein Problem der unterschiedlichen Kodierung

Wenn ich ein Upgrade meiner Maschine von XP auf Win7, ich meine Version von MySQL und PHP auch aufgerüstet. PHP-Programme Irgendwo auf dem Weg, die zur Arbeit eingesetzt aufgehört zu arbeiten. Insbesondere scandir, readdir und utf-8 war glücklich zusammen gelebt, aber nicht mehr.

Also, ich habe meinen Code geändert. Variablen, um Daten von der Festplatte Ende in „_ISO“ genommen bezogenen Windows-ISO-8859-1-Codierung, Daten aus der MySQL-Datenbank reflecct gehen in Variablen in ‚_utf‘ endet. Somit würde der Code von area5one wie folgt aus:     $ Dir_handle_iso = opendir ( "");     während (false! == ($ file_iso = readdir ($ dir_handle_iso)))     {     $ File_utf = utf8_encode ($ file);     ...     }

Dies funktioniert für mich 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"); Arbeitete für mich (Windows, dänische Zeichen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top