Autor Zpráva
na1k
Profil
Při práci se soubory jsem narazil na zajímavý problém. Pokud načítám obsah adresáře například přes readdir a soubory obsahují diakritiku, vypíšou se místo ní otazníky. To jsem vyřešil funkcí na převod znaků z cp1250 do utf (našel jsem ji někde na php.net a zdá se že funguje jak má). Mám tedy správný název souboru včetně diakritiky a mezer a jiných případných znaků (když web obsluhuje nějaká sekretářka tak se opravdu nestará o to, jestli nahrává soubor s diakritikou v názvu nebo ne :) ), ale problém přichází, když chci soubor dál zpracovat funkcí v php (narazil jsem na to u createimagefromxxx), protože funkce název souboru s diakritikou prostě nesežere a dělá, jakoby soubor neexistoval. Je potřeba název souboru před použitím v php opět převést na jiné kódování? Nějak mi to nejde do hlavy ... jakoby windows používal jedno kódování a php jiné... snad mi někdo alespoň náznakem poradí, předem díky :-)
bukaj
Profil
na1k
ale problém přichází, když chci soubor dál zpracovat funkcí v php (narazil jsem na to u createimagefromxxx), protože funkce název souboru s diakritikou prostě nesežere a dělá, jakoby soubor neexistoval
Ale on soubor s takovým názvem doopravdy neexistuje. Když si vezmeš, že řetězec není nic jiného než sled bytů, a že každé kódování interpretuje různé bajty jinak (UTF navíc interpretuje někdy několik bytů jako jeden znak), nemůžeš se ničemu divit - počítač neporovnává to, co se ti nakonec zobrazí, počítač porovnává právě ty byty.

Řešením je buď přenášet obě podoby jména. Nebo před použítím v cestách jméno vždy překódovat zpět.

jakoby windows používal jedno kódování a php jiné
Pokud vím, tak Windows používají předně pro všechno svoje kódování - v našich končinách je to windows-1250 (cp1250). Ale skript v PHP může být v jakémkoli kódování, které podporuje tvůj editor (většinou to jsou: windows-1250, iso-8859-2, UTF-8, někdy UTF-16).

Takže v podstatě každý používá jiné kódování.
na1k
Profil
Osvědčilo se, díky :) Jenom mi vrtá hlavou, jestli nebude problém, pokud skript poběží na hostingu kde bude linux. S ním nemám prakticky žádné zkušenosti, ale odhadoval bych, že používá iso-8859-2 ... je to možné? Stačilo by teoreticky nepřevádět názvy zpět na cp1250, ale na iso-8859-2?
Joker
Profil
na1k
Jak píše bukaj, počítač vidí název souboru jen jako řadu bajtů, tedy čísel.
Například vezmu řetězec "žluťoučký kůň" (v UTF-8), v paměti bude (napíšu to v šestnáctkové soustavě, ve dvojkové by to bylo hrozně dlouhé):
7E 01 6C 00 75 00 65 01 6F 00 75 00 0D 01 6B 00 FD 00 20 00 6B 00 6F 01 48 01
...a hledám, ale žádný soubor mi to nenajde, protože název "žluťoučký kůň" je (ve Windows-1250) v paměti uložený takhle:
9E 6C 75 9D 6F 75 E8 6B FD 20 6B F9 F2

Řešení je volat funkci s nepřevedeným názvem, jak píše bukaj.
Druhé řešení je při ukládání názvy souborů automaticky konvertovat do znaků bez diakritiky. Tak to dělám třeba při vytváření "cool uri" z nadpisu článku. Třeba z "Článek: #1?" bude adresa "(...)/clanek--1-.html"
bukaj
Profil
na1k
...Stačilo by teoreticky nepřevádět názvy zpět na cp1250, ale na iso-8859-2?
Pokud to budeš takhle praktikovat, koleduješ si o naprosto nepřenositelnou aplikaci. Co když pak změníš hostera nebo hosting změní operační systém?

Buď v aplikaci přenášej všude dva názvy (ten, pod jakým soubor zná filesystém a převedený). Nebo, což bude všeobecně lepší, zkonvertuj názvy souborů tak aby byly v každém kódování stejné, jak napsal Joker.

Nejlépe se omez na znaky malé a velké anglické abecedy, - (pomlčku), _ (podtržítko) a . (tečku).
na1k
Profil
To, že se název souboru ukládá podle kódování do jiné "posloupnosti bytů" a že je pak nejde porovnávat je mně jasné.

Každopádně přístup k souborům jsem vyřešil pomocí převodu (v mém případě z win1250 na utf8) a teď, jak správně podotkl bukaj, řeším spíše přenositelnost, protože ta je nutná.
Převádět názvy souborů na "bezpečné" je nápad dobrý, ale počítám s tím, že skript nemusí mít práva manipulovat se souborem, a to by znamenalo, že by byl nepoužitelný. A uchovávat oba (kódovaný i nekódovaný) názvy se mně taky zrovna nezamlouvá.

Napadá mě pokusit se (třeba podle nějakých specifických znaků) detekovat kódování systému a používat bežně utf s tím, že při načítání by se názvy převedly ze systémového do utf. Nebo ještě lépe někam do "configu" si jednoduše poznamenat v jaké znakové sadě jsou jména souborů a při práci s nimi automaticky konvertovat... myslíte, že je to špatný nápad?

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: