Autor Zpráva
Silver8000
Profil
Moderátor Davex: Téma bylo vytrženo z Rename složky s diakritikou a uložení do souboru.


Ahoj mam podobny problem...
kdyz nacitam slozky/soubory pres readdir tak ja je nechavam prejmenovavat pres funkci rename aby jejich odkaz byl spravny a dostupny pro dalsi ucely.

cili kdyz mam napriklad rename($soubor_nebo_slozka_s_diakritikou,$na_soubor_nebo_slozku_bez_diakritiky); treba takove pismenko ř nebo č a dalsi jine pismenka tak mi to vyhazuje chybu a soubor ci ta slozka se potom nezobrazuji spravne..

Vyzkousel jsem 'iconv',str_replace,strtr,urlencode a uz nevim co mam delat protoze pokazde to zkonci u toho ze funkce rename nemuze prejmenovat soubor/slozku...

Moc vas prosim o radu
ps: vlastne se jedna skoro o stejny problem jako zde - forum.php7.org/1366-utf8-znaky-ve-filesystemu
Davex
Profil
Silver8000:
tak mi to vyhazuje chybu
Jakou chybu?
Silver8000
Profil
Davex:
ja to mam osetreno pochopite ve skriptu a po spusteni:

index.php
<?php
$dir_handle = opendir(".");
while ($file = readdir($dir_handle))
{
if($file == '.' || $file== '..' || $file== 'include' || $file== 'index.php'){

}else{
$utf8_f_encoded = urlencode($file);
if(file_exists($utf8_f_encoded)){
echo $utf8_f_encoded."<br />";
}else{
$file_name_saved_in = mb_detect_encoding($file);
$file_convertion = iconv($file_name_saved_in, 'Windows-1250', $file);
rename($file,$file_convertion);
echo '<a href="'.$utf8_f_encoded.'">'.$file_convertion.'</a><br />';
}

}
}

?>

no a ted vytvorite soubor Akce nemluvně.txt do slozky kam date ten skript aby cetl slozku

momentalni chyba : Warning: rename(Akce nemluvne.txt,Akce nemluvne.txt)

Proste nemohu prejmenovat jakykoliv soubor s diakritikou.

muj originalni script je velmi podobny ale kdybych ho tu mel dat tak by bez ostatniho nejel tak jsem ho osekal pro vase pouziti.
takova ukazka co mam za aplikaci ve ktere jsem si sam definoval chybu kdyz nejde jakykoliv soubor prejmenovat:
kliknete pro zvetseni
Tori
Profil
Silver8000:
no a ted vytvorite soubor Akce nemluvně.txt
Jak vytvoříte? Přes FTP, nebo zadáváte název složky přes formulář, nebo jak?
Pokud přes nějaký formulář, tak byste měl nejdřív vyhodit diakritiku a pak teprv vytvořit složku už se správným názvem.
Silver8000
Profil
Tori:
Ja to mam na localhostu tak ze soubor vytvorim rucne samozhrejme muzu ten soubor vytvorit i pres formular - ftp neni potreba.

Jsem se zapomel zminit ze pouzivam winndows 7 a posledni verzi XAMPP servru.

Originalni aplikace kterou jsem vytvoril slouzi k vytvareni webovych stranek napriklad v PHP,HTML,JS a toto je taky jeji hlavni ucel krome toho ze jsem do ni intergroval i moznost prehravani Audio/Video souboru.

Moje aplikace kontroluje pokazde uz pri nacitani slozky spravnost jmen souboru a slozek aby jejich odkazi byli dostupne a pripraveny k dalsimu pouziti.

Problem je prave v tom ze kdyz uzivatel bude mit soubor s diakritikou a funkce rename ho ma prejmenovat(nahrazeni mezer a diakritiky) do spravneho tvaru ale nevim z jakeho duvodu se tak nedeje.

Jak vidite v tom osekanem skriptu ze funkce file_exists mi vyhazuje ze soubor neexistuje i kdyz mi ho PHP nacte a prave proto se ho snazim prejmenovat aby bylo vsechno v poradku.

Jedna se jednoduse o to ze pokud tu aplikaci bude pouzivat nekdo jiny a pro jine uceli nez vytvareni stranek napriklad pro seznam jeho medialnich souboru a bude mit slozky nebo soubory s diakritikou ktere tam prida manualne tak at je ta aplikace muze prejmenovat do spravneho tvaru a tim slozky a soubory zpristupnit pro zobrazeni nebo jinou cinnost.
Davex
Profil
Silver8000:
momentalni chyba : Warning: rename(Akce nemluvne.txt,Akce nemluvne.txt)
Uveď prosím celé znění chybové hlášky. Tu podstatnou část jsi vynechal.

Jak vidite v tom osekanem skriptu ze funkce file_exists mi vyhazuje ze soubor neexistuje
Asi bys měl používat jméno souboru získané funkcí readdir a nepřekódovávat ho.

... pro seznam jeho medialnich souboru a bude mit slozky nebo soubory s diakritikou ktere tam prida manualne tak at je ta aplikace muze prejmenovat do spravneho tvaru ...
Kdybych tvůj program spustil, tak bych nebyl rád, kdyby mi cokoliv dělal se jmény souborů.
Silver8000
Profil
Davex:
tam jen chybi hlaska on line a cislo radku

cil cele zneni chybove hlasky je : Warning: rename(Akce nemluvne.txt,Akce nemluvne.txt) on line cislo radku - na kterem je prave ta funkce rename


Davex:
Hlavni duvod proc chci soubory prejmenovavat je protoze po prekodovani do UTF-8 je stejne soubor na servru nedostupny.
Davex
Profil
Silver8000:
Chybová hláška bez uvedení konkrétní chyby by byla celkem kuriozita. Můžeš jí prosím ukázat naživo?

Mělo by tam být třeba něco jako

Warning: rename(originál,přejmenovaný) [function.rename]: The system cannot find the file specified. (code: 2) in skript.php on line 1

Hlavni duvod proc chci soubory prejmenovavat je protoze po prekodovani do UTF-8 je stejne soubor na servru nedostupny.
Nevím, co znamená, že je soubor nedostupný, ale ve skutečnosti asi nebude potřeba soubory přejmenovávat, protože na ně stačí správně odkazovat. Tedy v odkaze používat jméno souboru ve správném kódování (většinou UTF-8) a nezapomenout na URL kódování (rawurlencode). Pokud poběží PHP skript ve Windows, tak je potřeba počítat s tím, že budou přečtená jména souborů pravděpodobně v kódování windows-1250, ale na Linuxu v UTF-8. Možná se bude hodit funkce autoUTF z PHP FAQ.
Silver8000
Profil
Davex:
toto je ta hlaska : Warning: rename(Akce nemluvne.txt,Akce nemluvne.txt): in D:\xampp\htdocs\UTF8_converting\index.php on line 14
a to je vse co to vyhazuje.

Jsi to vyzkousejte na vasem localhostu .. vemte ten skript co jsem tu dal a pak tam dejde ten zmineny soubor a uvidite.
krome toho muze te ten skript prosim upravit do spravneho tvaru at vim presne jak to ma byt... dekuji
Davex
Profil
Stále se domnívám, že je v tomto případě přejmenování zcela zbytečné, protože může jména souborů nenávratně poškodit (navíc je i toto přejmenování špatně provedené).

V podstatě by mělo stačit jen správně vypsat odkaz a jméno souboru. Tedy řádky 8 až 16 nahradit následujícími a připojit funkci autoUTF.

$jmeno_utf8 = autoUTF($file);
$jmeno = iconv('utf-8', 'windows-1250', $jmeno_utf8); // pokud je kódování stránky windows-1250
echo '<a href="' . rawurlencode($jmeno_utf8) . '">' . htmlspecialchars($jmeno, ENT_QUOTES, 'ISO-8859-1') . '</a><br />';
Silver8000
Profil
Davex:
Pouzil jsem vase kodovani ale furt mi to nechce jet.

toto je kod ktery jsem zkombinoval s vasim :
index.php
<?php
function autoUTF($s){

    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) // detect UTF-8
    {
        return $s;
    }
    elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) // detect WINDOWS-1250
    {
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    }
    else // assume ISO-8859-2
    {
        return iconv('ISO-8859-2', 'UTF-8', $s);
    }
}


$dir_handle = opendir(".");
while ($file = readdir($dir_handle))
{
if($file == '.' || $file== '..' || $file== 'include' || $file== 'index.php'){

}else{
if(file_exists($file)){

}else{
$jmeno_utf8 = autoUTF($file);
$jmeno = iconv('utf-8', 'windows-1250', $jmeno_utf8); // pokud je kódování stránky windows-1250
echo '<a href="' . rawurlencode($jmeno_utf8) . '">' . htmlspecialchars($jmeno, ENT_QUOTES, 'ISO-8859-1') . '</a><br />';
}

}
}

?>

Je sice hezke ze tam neni diakritika ale soubor "Akce nemluvně.txt" neni stale dostupny pres jeho odkaz ktery php vyhodi(fyzicky je stale dostupny).

Navic ten kod je holi a nema nastaven charset header na Windows-1250 tak by to melo fungovat i presto ale bohuzel nic(zkousel jsem to iu s tim headrem a stejne nic).

funkce file_exists je ve skriptu jen proto abych nemusel nacitat celou slozku ale pouze jen soubor s diakritikou...

Ja uz nevim jak dal prosel jsem vsechny stranky co mi vyhodil google ohledne teto veci a stale jsem nic nenasel co by plne pracovalo tak jak ma.
Davex
Profil
Silver8000:
soubor "Akce nemluvně.txt" neni stale dostupny pres jeho odkaz ktery php vyhodi(fyzicky je stale dostupny)
A jak vypadá ten odkaz a adresa, když se na něj klikne? Je v něm diakritika? Měla by být, pokud ovšem máš nastavené ve Windows české prostředí, protože PHP nepracuje nativně v Unicode a se systémem komunikuje nějakým zastaralým způsobem, takže například s nastaveným prostředím US nebo GB můžou Windows u některých znaků diakritiku odstraňovat.
Silver8000
Profil
Davex:
No prave po kliknuti mam https://localhost/UTF8_converting/Akce nemluvne.txt a diakritika tam vubec neni tim padem soubor neni dostupny - co se tyce toho odkazu je take bez diakritiky.
Davex
Profil
Mnou uvedený kód diakritiku neodstraňuje a vypisuje jméno souboru tak, jak ho získá od operačního systému. Takže to není problém v PHP skriptu.
Silver8000
Profil
Davex:
Tak co s tim mam tedy provest??S timto problemem se setkavam po prve ze na strane PHP neni chyba ale primo v systemu.
Jinak diky za tve usili a ze se mi venujes i kdyz s delsi prodlevou.
Davex
Profil
Mělo by se to vyřešit přepnutím jazyka pro programy nepodporující Unicode na češtinu nebo slovenštinu.
Silver8000
Profil
Davex:

Tak jo jdu na vec a uvidime prepinam na podporu cestiny pro sw ktere nopodporuji sadu Unicode... snad to vyresi ten problem


Takze se to castecne vyresilo ted se v tom chvilku porejpu at vidim jestli je vsechno OK,jeste dam echo co a jak.
Silver8000
Profil
no tak je to ok az na jednu vec zkusil jsem tam dat slozitejsi soubor : Příliš žluťoučký kůň úpěl ďábelské ódy.txt
a ten soubor se zobrazuje takhle : ?Příliš žluťoučký kůň úpěl ďábelské ódy.txt
po kliknuti soubor neni dostupny a server hlasi chybu :

Access forbidden!

You don't have permission to access the requested object. It is either read-protected or not readable by the server.

If you think this is a server error, please contact the webmaster.
Error 403
localhost
Apache/2.4.2 (Win32) OpenSSL/1.0.1c PHP/5.4.4



a to je blbost kdyz mam plny pristup a navic jsem neprirazoval zadne opravneni.....
v ratil jsem se k tomu az ted nebot jsem nemel moc casu
peteo
Profil
Silver8000:
Problem je prave v tom ze kdyz uzivatel bude mit soubor s diakritikou a funkce rename ho ma prejmenovat(nahrazeni mezer a diakritiky) do spravneho tvaru ale nevim z jakeho duvodu se tak nedeje.

Predpokladám, že užívateľ ukladá súbor pomocou vašeho skriptu.
Tak ten súbor premenujte ešte pred uložením tak, aby nebol s diakritikou a pre informáciu užívateľa tam dajte nejaké echo typu

echo "váš dokument ukladám pod názvom Akce nemluvne.txt (diakritika v názvoch súborov nie je doporučovaná)";


ešte len doplním:
na localhoste i a serveri používam diakritiku bežne a problémy mi to (ani servru) nerobí, ten si to už premenuje na tie svoje percentá a hexdecimál:
napr. http://co-to-je.sk/spresne.php?dotaz=Janků, Heidi
Silver8000
Profil
peteo:
jasne ale ja spoleham na blbost uzivatele ze muze vytvaret soubory manualne a bez toho skriptu a proto to resim aby skript dokazal odstranit diakritiku
peteo
Profil
Silver8000:
Spoliehaj na blbosť užívateľa.
Keď si otvorí tvoj program a bude v ňom hľadať svoj súbor Akce nemluvně.txt a nenájde ho, nechaj vypísať:
Vami hľadaný súbor nebol nájdený. Presvedčte sa, že ste súbor nahrali (skopírovali) do správneho adresára a že jeho názov bol bez diakritiky (včítane medzier).

Nabudúce ho nahraje bez diakritiky.

Prípadne mu hneď môžeš ponúknuť názov akce-nemluvne.txt i s formulárom, pomocou ktorého to tam vloží.
Davex
Profil
Silver8000:
ten soubor se zobrazuje takhle : ?Příliš žluťoučký kůň úpěl ďábelské ódy.txt
Stačilo by zjistit, kde se bere ten otazník na začátku, protože tam nemá být. Vše za otazníkem považuje webserver za parametr a ne jako jméno souboru.
peteo
Profil
Davex:
Neviem, ako získavaš to meno súboru, ale keď tam je ten ? vždy, tak
$meno_suboru = "?Příliš žluťoučký kůň úpěl ďábelské ódy.txt" ; // ty ho samozrejme získaš načítaním
$meno_suboru = substr($meno_suboru, 1);
Davex
Profil
peteo:
Předpokládám, že jméno souboru Silver8000 získává funkcí readdir (viz [#11]) a ta by otazník přidávat neměla.
peteo
Profil
Stále nechápem, čo sa tu vlastne rieši (ja viem, to premenovanie).
Užívateľ je autor, má to na localhodte[#5] , tak sa pozrie do adresára a aha, toto je špatné meno, tak to pomenuje korektne a basta.
Program používať iba s korektnými súbormi nahranými cez formulár a basta (viď [#21]), celý problém mi pripadá ako vykonštruovaný.
Predpokladám, že dnes každý vie, že súbory je dobrým zvykom ukladať bez diakritiky a medzier (i keď, ako vidím, nie každý ctí dobré zvyky).
To že si tam autor naťahá Příliš žluťoučký kůň úpěl ďábelské ódy.txt a potom tu špekuluje, sa divím (a nevychádzam z úžasu, prečo si súbor nepomenuje Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.txt alebo لقاعدة.txt).
Silver8000
Profil
peteo:
Chapu te ale prave proto me to zajima ... napriklad kdyz uz nejde pouzivat diakritiku spravne tak ji aspon spravne odstranit at je tam jakykoliv jmeno souboru.

Vim ze je to velka problematika ale kdyz neni poradna podpora prekladu mezi kodovanim tak by se mohlo aspon vymyslet neco universalniho na odstranovani diakritiky a pote spravne zobrazeni uzivateli.
Amunak
Profil
Silver8000:
Neni to velka problematika. Kdyz pises webovou aplikaci a mas tam nahravani souboru, proste pri urcovani nazvu nedovol hacky a carky. Nebo to nazyvej nejakym ID, pak cti toto ID a prirazuj k nemu nazev, ktery mas ulozeny treba v databazi. Tam pak muze byt naprosto cokoliv. I prejmenovani bude mnohem snazsi - misto upravy souboru jen zmenis radek v tabulce.

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: