Autor Zpráva
potom
Profil
Ahoj, můj problém:

Mám něco jako fotobanku -
PHP a MySQL - vše jede v kódování latin2 (8859-2)

a v té fotobance je možnost, uploadovat hromadně fotky tak, že se nahrajou na FTP do uploadovací složky a když se spustí skript, tak se samy zařadí do databáze, vytvoří náhledy atd.............

V té fotobance je stěžejní práce s klíčovými slovy, pomocí kterých se vyhledávají fotografie.

Ty jsou k fotkám přiřazeny tak, že jsou v názvu souborů - tj.

uploaduju fotku s názvem "žába příroda zvířata rosnička.jpg" a další.. na server a

spustím skript -
ten díky názvu získá klíčová slova a vloží je do databáze
a pak soubor normálně přejmenuje podle ID z databáze např. na 65454.jpg


problém je právě s kódováním toho názvu.........
jak to mám převést do databáze v latin2 ????????

díky za radu..........
Kajman_
Profil *
asi pomocí iconv
potom
Profil
No jasně, mě jde spíš o to v jakym kódování jsou ty názvy souborů..........
Joker
Profil
potom
No jasně, mě jde spíš o to v jakym kódování jsou ty názvy souborů
Tak tohle by mě taky zajímalo.
Jednou jsem chtěl číst název souboru/adresáře přes parametr v url, například:
stranka.php?soubor=nazev
a zaboha to ne a ne rozchodit pro soubory s diakritikou... u souboru třeba "žluťoučký kůň.jpg" ať jsem převáděl kódování jak jsem chtěl, třeba file_exists ho nikdy nenašlo.
Kajman_
Profil *
Když si vypíšete jenom názvy souborů, tak nepoznáte v prohlížeči, v jakém kódování to je?
potom
Profil
když si vypíšu názvy souborů tak vznikne v 8859-2 toto:




$new = iconv('utf-8', 'ISO-8859-2', $old); nezabere
lordfrikk
Profil
A databázi máš nastavenou na UTF-8?
potom
Profil
lordfrikk

A databázi máš nastavenou na UTF-8?

všude mám to latin2 (8859-2) - stránky i databáze,
jde mi jen o převod toho filename do latin2 ale nevim z čeho
Kajman_
Profil *
Spíš byt tipnul, že je nutné mít sladěné kódování, které používá (ftp) server pro názvy souborů, s kódováním ve kterém to posílá ftp klient.
potom
Profil
No ve výpisu potom v TC jsou ty názvy normálně s háčkama takže to kodování českejch znaků se nikde neztrácí, jde prostě jen o to v jakym kódování to tam je a jak to změnit do 8859-2
Aleš Janda
Profil
Podle mých zkušeností to neošetříš. Kódování názvu souboru totiž závisí na tom, v jakém kódování se to tahá z filesystému. Na Windows se to bohužel z nějakých historických důvodů tahá v národním windows kódování - na středoevropských Windows se tedy jedná o kódování windows-1250. Ovšem všude mimo střední Evropu dostaneš jiné kódování. Co to udělá se znaky, které v kódování nelze uložit, nevím.

Na Linuxu lze kódování FS zvolit, ovšem posledních tak 5 let už je všude standardně nastaveno kódování utf-8, které je naštěstí po celém světě stejné. Čili odešlu-li formulář z Linuxu, dostaneš název souboru v utf-8. Dřív se na *nixových systémech používalo také národní kódování, ovšem iso (u nás tedy iso-8859-2).

To použité kódování se ale nikde neposílá. Čili v podstatě to nějak dobře není řešitelné. Pokud by někdo věděl řešení, uvítal bych ho taky.
Jedině mě napadá podle User-Agent odhadnout systém a případně podle Accept-Language odhadnout lokalizaci Windows. Nebude to čisté řešení, ale většnou to bude fungovat.

Mimochodem třeba u ZIP archivů je podobný problém - názvy souborů se také ukládají v kódování FS a toto kódování není nikde definováno. Takže přenosem Windows => Linux (windows-1250 => utf-8) se diakritika zmrší, naopak samozřejmě taky, a totéž přenosem mezi dvěma Windows různých lokalizací. Kódování názvů souborů je problém, se kterým se kvůli "zpětné kompatibilitě" budeme potýkat asi ještě hodně dlouho...
potom
Profil
Tak jsem to ošetřil a úplně neobratně - ale pro mě je důležitá funkčnost a ono to funguje

Samotnej název souboru ten prostě ať sem dělal cokoliv nešel změnit do latin2, ale zkoušením a hraním s tim sem zjistil, že jde vytvořit totožnej soubor

$name ............. filename souboru s diakritikou (bez koncovky .jpg)................

$soubor = fopen("temp/".$name.".inf", "a+");
fwrite($soubor, $name);
fclose($soubor);

čímž sem v paralelnim adresáři TEMP vytvořil soubor se stejnym názvem jako má obrázek a do něj jsem zapsal název.

a hle......... obsah souboru je v CP-1250

a načíst obsah do proměnné a převést do latin-2 a pak ten soubor inf skriptem smazat už neni problém


........ vyřešeno


ale proč to nejde převést rovnou ale takhle neobratně, to jsem jelen..........

možná že to na jinym hostingu nebo v jiný části světa fungovat nebude, ale mě to stačí bohatě takto..
Aleš Janda
Profil
potom
??? No to je hukot. Zapisuješ do souboru text jenom proto, abys ho potom hned přečetl a soubor smazal?

Udělej to takto (pokud máš český web, bude to většinou fungovat):

$name = iconv(StrPos(@$_SERVER['HTTP_USER_AGENT'],'X11') !== false ? 'utf-8' : 'windows-1250','iso-8859-2',$name);


Doplnění: Celou dobu jsem myslel, že se jedná o upload formulářem návštěvníka. Nějak jsem si toho klíčového slova FTP nevšiml. Čili celé to je trochu mimo ;-)
Kajman_
Profil *
Zo zkusit nahrát soubory třeba pomocí programu filezilla místo tc?

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: