Autor Zpráva
Eflyax
Profil
Ahoj,
potřebuji poradit s výpise souborů z adresáře. Pomocí skriptu se vypíšou všechny složky a soubory v nich a vytvoří se na tyto soubory odkazy na stažení - vše funguje perfektně. Problém je v kódování názvu souborů. Na serveru je naistalován UNIXový operační systém (Debian GNU/Linux).
Pomocí jednoho podprográmku jsem se pokoušel zjistit jaké používá kódování a pomocí funkce readdir() ty vyleze v ISO-8859-2.
Pokud to takto nechám, místo háčků a čárek se zobrazí kostičky a nefunguje ani odkaz.
Použil jsem tedy funkci iconv() která mi ten název zkonvertuje. Po konverzi z ISO-8859-2 na utf-8 je název odkazu v pořádku, ale samotný odkaz nefunguje, např.:
vygeneruje se odkaz pro soubor: "název.txt"

Adresa je taková:
(adresa).../projekt/download/I3//n%C3%A1zev.txt

Po otevření odkazu se mi ukáže:
(adresa)...projekt/download/I3//název.txt was not found on this server.

Jak to mám zkonvertovat?
Měnit název souborů nemůžu!

<?php
        $cesta = "download";
       echo  vypis_adresar($cesta);
             

        function vypis_adresar($cesta) 
      { 
             if (substr($cesta,(strlen($cesta)-1),1)<>"/") {$cesta = $cesta."/";} 
             echo"<ul>"; 
             $handle = opendir($cesta);  
             while (false!==($file = readdir($handle)))  
             {                                   
                   $file_utf8 = iconv("ISO-8859-2", "utf-8", $file);
                    if ($file != "." && $file != "..")      
                    {          
                       $dir = false; 
                       if (is_dir($cesta.$file))  
                       { 
                            echo "<li style=\"color:red\">$file</li>\n"; 
                            vypis_adresar("$cesta$file"); 
                       } 
                       else 
                       { 
                            echo "<li style=\"color:black\"><a href='$cesta/$file_utf8'>$file_utf8</a></li>\n";     
                       } 
                    } 
             }
              closedir($handle);  
            echo"</ul>";
      }

 ?>



Tak už jsem tento problém vyřešil, zde je řešení:

PHP skript musí být typu utf-8.
Pak v tom skriptu jako první provedu konverzi
$file_utf8 = iconv("windows-1250", "utf-8", $file);

Pak:
 $Nazevadresy = iconv("ISO-8859-2", "utf-8", $file);
Kde se mi zkonvertuje čistý český text.

A pak je potřeba zkonvertovat háčky a čárky:
                   $file_utf8 = Str_Replace ("ě", "%EC", $file_utf8);
                   $file_utf8 = Str_Replace ("š", "%B9", $file_utf8);
                   $file_utf8 = Str_Replace ("č", "%E8", $file_utf8);
                   $file_utf8 = Str_Replace ("ř", "%F8", $file_utf8);
                   $file_utf8 = Str_Replace ("ž", "%BE", $file_utf8);
                   $file_utf8 = Str_Replace ("ý", "%FD", $file_utf8);
                   $file_utf8 = Str_Replace ("á", "%E1", $file_utf8);
                   $file_utf8 = Str_Replace ("í", "%ED", $file_utf8);
                   $file_utf8 = Str_Replace ("é", "%E9", $file_utf8);
                   $file_utf8 = Str_Replace ("ď", "%EF", $file_utf8);
                   $file_utf8 = Str_Replace ("ť", "%BB", $file_utf8);
                   $file_utf8 = Str_Replace ("ň", "%F2", $file_utf8);
                   $file_utf8 = Str_Replace ("ú", "%FA", $file_utf8);
                   $file_utf8 = Str_Replace ("ů", "%F9", $file_utf8);
                   $file_utf8 = Str_Replace ("Š", "%A9", $file_utf8);
                   $file_utf8 = Str_Replace ("Č", "%C8", $file_utf8);
                   $file_utf8 = Str_Replace ("Ř", "%D8", $file_utf8);
                   $file_utf8 = Str_Replace ("Ž", "%AE", $file_utf8);
                   $file_utf8 = Str_Replace ("Á", "%C1", $file_utf8);
                   $file_utf8 = Str_Replace ("Ú", "%DA", $file_utf8);
Výsledný odkaz pak vypíšu takto:
echo "<li style=\"color:black\"><a href='$cesta/$file_utf8'>$Nazevadresy</a></li>\n";

Výsledný odkaz je funkční (lze stáhnout soubor) a v názvu odkazu je český text (á,ž,ý,Č, ť,....)
Tori
Profil
Eflyax:
Koukněte se na fci urldecode. Pokud byste ji použil takto: $file_utf8 = iconv("windows-1250", "utf-8", urldecode($file)); , tak by imho nemělo být už potřeba dělat těch 20 str_replace. (Pokud přesto budou potřeba, koukněte na strtr, možná by to přehlednější.)
Aleš Janda
Profil
Eflyax:
PHP skript musí být typu utf-8.
Pak v tom skriptu jako první provedu konverzi
$file_utf8 = iconv("windows-1250", "utf-8", $file);

Vážně je tam windows-1250, ne iso-8859-2?


A pak je potřeba zkonvertovat háčky a čárky:

Uf, takže ty napřed převedeš název z windows-1250/iso-8859-2 na utf-8 a potom ho sérií nahrazení převedeš zpátky na iso-8859-2. Myslím, že by mělo úplně stačit
echo '<li style="color:black"><a href="'.urlencode($cesta).'/'.urlencode($file_utf8).'">'.htmlspecialchars(iconv('iso-8859-2','utf-8',$Nazevadresy))."</a></li>\n";

Mimochodem, používat iso-8859-2 bylo v Linuxu aktuální tak do roku 2004. Od té doby se všude prosazuje utf-8. Takže buď se jedná o nějaký hodně historický stroj, anebo hodně zamrzlého admina.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0