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é.


Ukázky k nahlédnutí kodovani-souboru.php.

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 k článku RSS Komentáře   Add to Google
16.04.2008 07:43 | Anonym (v6ak) | úprava při změně

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.

17.04.2008 13:03 | Administrátor | Re: úprava při změně

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?Ro­bot, 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í.

16.11.2008 12:55 | Anonym (Srigi) | kodovanie

Mno kodovanie ide zistit >> http://latrine.dgx.cz/…kce-kodovani

17.11.2008 12:19 | Administrátor | Re: kodovanie

ano, ale neřeší to problémy filesystému o kterých je tento článek

30.01.2009 17:12 | Anonym (Petr) | Existuje jiné řešní problému, než doporučení na konci článku?

Mám obdobný problém, stránky v UTF-8, mysql taky v UTF-8. Problém je s uplodem souborů (obrázků) přes formulář. Existuje jiné řešní problému, než před uplodem odstranit diakritiku v názvu souboru?

31.01.2009 10:26 | Administrátor | Re: Existuje jiné řešní problému, než doporučení na konci článku?

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

24.02.2011 13:22 | Anonym (Wolf Officious) | Blbost

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.

24.02.2011 19:30 | Administrátor | Re: Blbost

nejsem si jist jestli jsem to vysvětlil dostatečně, ale problém spočívá, že není rozumný nápad používat diakritiku v názvu souboru, je to tam napsané? nebo není?

ale určitě to tam někde bude, snad to vyplívá alespoň z kontextu

24.02.2011 20:37 | Anonym (Wolf Officious) | Re: Re: Blbost

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.

01.08.2011 15:41 | Anonym (norrsken) | Re: Re: Blbost

snad to vyplívá alespoň z kontextu člověče, ty jsi s diakritikou nejspíš zapomněl i češtinu… fůj

02.08.2011 08:49 | Administrátor | Re: Re: Re: Blbost

díky za komentář, to se hodí, byl hodně přínosný

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>