Autor | Zpráva | ||
---|---|---|---|
Eflyax Profil |
#1 · Zasláno: 10. 12. 2011, 16:59:20 · Upravil/a: Eflyax
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); 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); 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 |
#2 · Zasláno: 10. 12. 2011, 19:24:28 · Upravil/a: Tori
|
||
Aleš Janda Profil |
#3 · Zasláno: 11. 12. 2011, 11:29:44
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. |
||
Časová prodleva: 12 let
|
0