Autor | Zpráva | ||
---|---|---|---|
na1k Profil |
#1 · Zasláno: 25. 10. 2007, 23:52:59
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 |
#2 · Zasláno: 26. 10. 2007, 09:02:48
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 |
#3 · Zasláno: 26. 10. 2007, 09:33:28
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 |
#4 · Zasláno: 26. 10. 2007, 09:41:09
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 |
#5 · Zasláno: 26. 10. 2007, 09:58:09 · Upravil/a: bukaj
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 |
#6 · Zasláno: 28. 10. 2007, 17:23:39
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? |
||
Časová prodleva: 16 let
|
0