2010-04-21 15 views
6

Uso caratteri speciali (lettere svedesi åäö).caratteri speciali nel problema "file_exists" (php)

Ora, ho alcune cartelle, che contengono immagini per annunci. Le cartelle sono nominate per categoria.

for ($i=1; $i<=5; $i++){ 
    if (file_exists($big_images.$i.'.jpg')){ echo "Inne"; 
     unlink($big_images.$i.'.jpg'); 
    } 
    if (file_exists($thumb_images.$i.'.jpg')){ 
     unlink($thumb_images.$i.'.jpg'); 
     } 
    } 

Consentire fino a 5 immagini sul mio sito, ciascuna che termina con un numero 1-5. Tuttavia, il mio problema è questo, ogni volta che il nome della cartella ha un carattere speciale, il file_exists restituisce false, cioè non trova il file. Anche se è lì.

Tutti i documenti sono in formato utf-8.

Questo funziona quando non ci sono caratteri speciali nei nomi delle cartelle.

Se avete bisogno di più input fatemi sapere

+0

Quale sistema operativo stai utilizzando? – zaf

+0

wampserver, sulla macchina locale, windows –

risposta

22

Qual è il sistema operativo server?

Se è di Windows, non sarete in grado di accedere ai file con un nome di file UTF-8-encoded, perché l'implementazione di Windows delle librerie C IO usato da PHP parlerà solo nella pagina di codice predefinita del sistema. Per installazioni dell'Europa occidentale, che è il codice delle pagine 1252. È possibile convertire una stringa UTF-8 per CP1252 usando iconv:

$winfilename= iconv('utf-8', 'cp1252', $utffilename); 

(utf8_decode potrebbe essere utilizzato anche, ma sarebbe dare i risultati sbagliati per i caratteri di estensione di Windows che mappano nell'intervallo 0x80-0x9F in cp1252.)

I file i cui nomi includono caratteri al di fuori del repertorio della codepage di sistema (ad esempio greco su una casella occidentale) non possono essere utilizzati affatto da PHP e altri programmi che utilizzano lo stdio. Esistono linguaggi di scripting che possono utilizzare nomi di file Unicode nativi tramite API Win32, ma PHP5 non è uno di questi.

E, naturalmente, il passaggio precedente non deve essere utilizzato quando distribuito su un sistema operativo diverso in cui il filesystem è codificato in UTF-8. (per esempio Linux moderno.)

Se è necessario interagire senza interruzioni tra server e PHP, è necessario astenersi dall'utilizzare caratteri non ASCII nei nomi dei file. Scusate.

+0

Sto riscontrando questo problema su un sistema che, a causa dell'uso dei requisiti dei casi, * deve * essere ospitato su una macchina Windows e * deve * contendersi con file che hanno caratteri al di fuori della codepage 1252 . Ho scoperto che le librerie 'DirectoryIterator' e' SplFileInfo' sono in grado di interagire con questi file. 'iconv' lancia avvisi su caratteri non validi e' file_exists' fallirà in molte circostanze. +1 da parte mia per avermi messo in pista che alla fine ha portato alla nostra soluzione di mezza misura, e di nuovo notare che 'SplFileInfo' sembra essere una soluzione più universale. –

+0

in alternativa il carattere url che sostituisce caratteri speciali nei nomi dei file può essere una buona soluzione. – user544262772

+0

Non posso enfatizzare abbastanza: "** ... Se devi essere perfettamente compatibile con i server incrociati con PHP, dovrai astenervi dall'usare caratteri non ASCII nei nomi dei file ... **" –