Diakritika a kódování názvu souboru při práci v PHP
Používat diakritiku a rozdílná kódování v názvu souborů není moudré.
Pracoval jsem dlouhou dobu na projektu, který už má něco za sebou. Funguje asi 10 let a za tu dobu měnil platformy, verze php, začal se vyvíjet ještě v PHP3, verze apache, různá nastavení systému, verze linuxu, různé verze kódování stránek, několikrát změna kódování databáze atd.
Výsledkem bylo to, že se nashromáždilo pár giga obrázků a samozřejmě s diakritikou v názvu a ještě s různými kódováními. Obrázky byli uloženy v kódování iso-8859-1, windows-1250 nebo utf-8.
Doteď mi není jasné jak pracovat se soubory s diakritikou v názvu prostřednictvím php, například pomocí ftp někdo nahraje obrázek z windows, někdo pomocí formuláře zadá háčky a čárky do názvu ukládaného obrázku nebo jednoduše stačí mít stránky v utf-8 kódování a pomocí formuláře nahrát na server soubor s diakritikou.
Problém nastává, když chcete k těmto souborům následně přistupovat. Např. pomocí ajaxu načíst skript, který má vytvořit náhled a zobrazit ho nebo pomocí odkazu na obrázek, který by se měl otevřít v novém okně. Jde o to, že nikdy nevíte v jakém kódování je soubor na serveru uložený a proto ani použití iconv nebude moc platné.
Celý článek má být varováním. Nepoužívejte diakritiku v názvu souborů, nahrávaných na server!
Pokud má někdo kladné zkušenosti nebo mi něco uniklo, nechť se podělí o svůj názor.
Příklad ukazuje o čem mluvím, ale asi je to v celku jasné. Já tento problém řeším tím, že před uložením souboru změním jeho název pomocí funkce na generování cool url adres a tím se zbavím diakritiky a všech dalších škodlivých znaků co nenajdete v ascii.
komentáře
RSS Komentáře
Spravuji třeba projekt, kde je přes 10000 nahraných souborů, vznikal 10 let, za tu dobu se několikrát změnila diakritika webu, jak chcete upravit diakritiku u stávajících?Robot, který projde všechny soubory a převede diakritiku a uloží znovu? Neznáte vstupní kódování. Krom toho provádět něco podobného je dost problém. Co přenositelnost projektu? Systém to neřeší nijak, systém to uloží právě v kódování v jakém je soubor poslán.
Zvýraznil jsem příklad, kde je to vidět.
Stejný problém nastane, když uživatelé budou přistupovat k ftp z windows a z linuxu nebo jiných platforem. Každá bude používat jiné kódování.
například převést do potřebného kódování pomocí iconv, ale předtím je potřeba zjistit v jakém je kódování, pomůže automatická detekce od dgx viz. diskuse, ale článek je o tom, že diakritika může přinést dost problémů, tedy je jedno kdy, ale doporučuji před nebo po uploadu ji odstranit
Já upload obrázků řeším tak, že z název souboru hodím do UTF8, odstraním diakritiku a speciální znaky, přidám k názvu souboru náhodné číslo pomocí rand() a tohle všechno zašifruju pomocí sha1. Dále zjistím mimetyp a připojím příslušnou příponu. Asi hodina práce včetně hledání na netu. Takže v čem je problém? Když se to od začátku píše blbě, není se čemu divit.
Jistě, používat diakritiku v názvech souborů na webu je sebevražda, to nevyvracím. Nicméně mi nejde na rozum to, proč by se o tom kdokoliv měl šířit. Teoreticky bych chtěl diakritiku v názvech souboru – okay – pak jsou zde, v komentářích, popsány nebo avizovány metody, které jsou účinné. Převedu si název souboru na UTF, před záznamem do DB provedu
<?php
mysql_query("SET NAMES 'UTF8';");
?>
a mám klid. Názor jsem vyjádřil, suďte mne, ale uvažujte.



Co takhle pravit při každé změně názvy stávajících souborů? Jinak, jak to řeší systém? Neměo by to být převáděno na jedno systémové kódování?BTW: já taky mám radši soubory bez diakritiky.