PDA

Pogčedajte punu verziju : Download fajlova sa non-ascii imenima


jablan
30. 06. 2006., 10:23
Dakle, pitanje je vezano za veb programiranje... Da li je neko od vas imao problema sa serviranjem fajlova koji imaju neke non-ascii (unicode) karaktere u imenu? Imam situaciju da korisnici downloaduju fajlove preko neke skripte, nebitno da li se fajlovi vuku sa diska ili iz baze. Pre nego što pošaljem fajl šaljem Content-disposition HTTP header koji između ostalog navodi i ime fajla (da se korisniku ne bi pri snimanju ponudilo ime FileWriteToUser.aspx). Nažalost, Content-disposition ne podržava enkodiranje imena fajla. Probao sam sa urlencode, ali se većina brauzera ne snalazi (nude ime sa sve procentima).

Nadam se da sam bio dovoljno jasan. Kako vi rešavate ovaj problem, ako ga rešavate? Postoji li neki način osim rewrite-ovanja URL-a?

ivanhoe
30. 06. 2006., 18:15
a sto ne prebacis ime fajla da bude cisti ascii, pre nego sto ga dodas u header ?

Ionako nije zdrava ideja snimati fajlove sa non ascii znacima u imenu, jednom sam u WinXP-u imao grdnih problema da obrisem fajl cije je ime bilo cirilicno. Otvaranje i sve ostalo je radilo, ali brisanje nije htelo.

oliver
30. 06. 2006., 21:34
ili, jos bolje, prilikom uploada preimenovati u nesto "normalno", i rijesio si se muke u samom startu.

zextra
30. 06. 2006., 23:15
Verovatno covek ima debeo razlog zasto je to tako kako jeste.

Mogao bi eventualno da replacujes filename pre nego sto ga strpas u header, npr sve non-ascii karaktere (zapravo, ovo je malo gruba podela.. ascii karakteri su svi od 0 do 255, a to nije ono sto hoces, siguran sam :P) replacujes sa underscore ili necim drugim, jos zgodnijim.

jablan
02. 07. 2006., 09:27
Hvala na predlozima, ali ništa mi od ovog ne pije vodu. Da konvertujem ne mogu, jer konverzija nije jednoznačna (nisam nikad video neku funkciju koja ovo radi), u pitanju je višejezična aplikacija (zapravo CMS platforma) i ne zna se koji će se jezici sve koristiti. Zamena underscorovima mi takođe nije ok, pogotovu ako su svi karakteri iz imena izvan ascii (npr ćirilični).

Po svemu sudeći moraću da radim URL rewrite (ako uopšte odlučimo da pokrivamo ovaj problem).

Pedja
02. 07. 2006., 11:51
NE vidim sta je problem zameniti nezgodne karaktere nizom cisth asci znakova, tako da se zadrzi jednoznacnost a ostvi prostor da se restaurira tacno ime datoteke.

Ja bih recimo pre proveravao ime datoteke i ako sadrzi neki nezgodan znak, prekidao bih operaciju i korisniku prikjavljivao gresku.

Treca opcija je da datotekama sam dajes imena. Ne moras zadrzavati imena koja im daju korisnici.

zextra
02. 07. 2006., 12:11
@Pedja: covek je upravo naveo primer da se ime fajla moze sastojati skroz iz cirilicnih karaktera, pa bi dobio fajl koji se zove, npr ____ _ ______-____.doc.

Prilicno jasan naziv, zar ne? :D

ivanhoe
02. 07. 2006., 15:34
a da se napise funckija koja radi univerzalno prevodjenje tako sto za svaki jezik koji se koristi definises slova koja treba prevesti i njihove ascii parove (nema toga toliko puno), i onda samo pogledas koji je jezik u pitanju, ucitas parove za taj jezik i prevedes ih...

Petar Marić
02. 07. 2006., 22:15
Heh, pre mesečak dana se pojavio sličan problem na django dev mail listi. Naime, žalio sam se (http://groups.google.com/group/django-developers/browse_frm/thread/cecdf42cb3430601?tvc=1) što slugify js funkcija "jede" sve karaktere koji su izvan dozvoljenog ASCII opsega, te samim tim izostavlja unicode karaktere.

Baci pogled na tu diskusiju, možda dobiješ koju ideju ;)

Pedja
03. 07. 2006., 00:52
@Pedja: covek je upravo naveo primer da se ime fajla moze sastojati skroz iz cirilicnih karaktera, pa bi dobio fajl koji se zove, npr ____ _ ______-____.doc.
Prilicno jasan naziv, zar ne? :D

Obrati paznju da sam govorio o zameni problematicnih znakova odgovarajucim nizom citkih a ne da svi budu zamenjeni jednim te istim kao u tvom primeru.

zextra
03. 07. 2006., 03:06
@Pedja: da, razumem, u pravu si, ako pricamo samo o latin- i cyrilic-based charsetima, gde se vecina slova mogu prevesti u ascii ekvivalente. A sta je sa, recimo, grckim, arapskim, kineskim? Iskreno, ne verujem da ce covek imati posla sa bilo kojim od tih prevoda, ali ko zna... ;)

Da ne sirimo diskusiju, covek je shvatio sta smo hteli da kazemo.

:)

Petar Marić
03. 07. 2006., 11:55
Na gorespomenutoj diskusiji (http://groups.google.com/group/django-developers/browse_frm/thread/cecdf42cb3430601?tvc=1) se pričalo o takvim problemima, i opšti zaključak je da je tako nešto moguće (teoretski napraviti) ali zahteva prilične napore u traženju i obradi specijalnih slučajeva.
Npr, verovatno ste čuli da Jevreji pišu s desne na levu stranu - ali da li ste znali da se u njihovom pismu isti glas piše (i čita) drugačije ako se nalazi na početku, u sredini i na kraju reči?

jablan
03. 07. 2006., 12:17
Da, ali zato imaju samo 26 slova i to bez razlike između velikih i malih. :)

Pedja
03. 07. 2006., 14:36
@Pedja: da, razumem, u pravu si, ako pricamo samo o latin- i cyrilic-based charsetima, gde se vecina slova mogu prevesti u ascii ekvivalente. A sta je sa, recimo, grckim, arapskim, kineskim? Iskreno, ne verujem da ce covek imati posla sa bilo kojim od tih prevoda, ali ko zna... ;)


Ma ja i ne pricam o takvoj konverziji vec o jednoznacnoj konverziji.

Da pojednostavnimo: svi podaci koji se digitalizuju zapisuju se sa samo dva "znaka" jedinicom i nulom. Ako sve moze da se zapise jedinicom i nulom, valjd amoze i sa 25 znakova engleske abecede, samo ako se usvoji odredjeno pravilo po kome se vrsi konverzija. Kada uradis urlencode() upravo radis jedno takvo kodiranje.

Sve je to stvar procene isplati li se to raditi i koliko je to neophodno.

Postoji jos jedan prilicno dobar nacin: datoteke se cuvaju pod izgenerisanim imenima, a stvarno ime se cuva recimo u bazi, sa vezom prema datoteci kojoj to ime pripada.

Generalno je ipak, najbolja opcija izbegavati specijalen znakove u imenima datoteke i ne dozvoljvati da se korsiti ista osim standardnih znakova engleske abecede, brojeva i dozvoljenih znakova interpunkcije.


Npr, verovatno ste čuli da Jevreji pišu s desne na levu stranu - ali da li ste znali da se u njihovom pismu isti glas piše (i čita) drugačije ako se nalazi na početku, u sredini i na kraju reči?


Kako se cit anije bitno posto je ime datoteke zapisano, pa je samo problem kako to sto je zapisano sacuvati.

jablan
03. 07. 2006., 15:18
Postoji jos jedan prilicno dobar nacin: datoteke se cuvaju pod izgenerisanim imenima, a stvarno ime se cuva recimo u bazi, sa vezom prema datoteci kojoj to ime pripada.
Ja i čuvam datoteke pod izgenerisanim imenima, a u bazi unicode originale. Problem mi se javlja kad šaljem fajlove nazad korisnicima.

Petar Marić
03. 07. 2006., 18:58
Kako se cita nije bitno posto je ime datoteke zapisano, pa je samo problem kako to sto je zapisano sacuvati. Ne bih se složio, ako koristiš sound-a-like tip prevoda onda ti je prilično bitno kako se glas čita. Nisu svi imali Vuka ;)

Look-a-like:
č -> c
ć -> c
š -> s
ž -> z
đ -> dj

Sound-a-like:
č -> ch
ć -> tj
š -> sh
ž -> zh
đ -> dj


A detekcija jezika i njegovih "muzičkih želja" je tek veselje. Možda je najbolje da im vratiš sha.new(filename).hexdigest() :1064:

Pedja
03. 07. 2006., 22:18
Petre, to o cemu pricas nije JEDNOZNACNO kodiranje.