2009-06-10 11 views
7

Ad esempio, ho un nome di file come questo - проба.xml e non riesco ad aprirlo dallo script PHP.Come aprire il file in PHP che ha caratteri unicode nel suo nome?

Se script di installazione php per essere in UTF-8 di tutto il testo in caratteri è UTF-8 così quando passo questo per file_get_contents:

$fname = "проба.xml"; 
file_get_contents($fname); 

ottengo l'errore che il file non esiste. La ragione di ciò è che in Windows (XP) tutti i nomi di file con caratteri non latini sono unicode (UTF-16). OK così ho provato questo:

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

Ma l'errore persiste in quanto file_get_contents non possono accettare stringhe Unicode ...

Qualche suggerimento?

+0

è questa corrente di codice? Non hai cambiato $ fname con $ res in file_get_contents, o era solo un refuso? – ryanday

+0

Questo è il mio refuso. Ho effettivamente cambiato i valori. –

+0

Sono arrivato al mio sistema XP e ho provato il tuo codice. Ho salvato il file PHP in unicode e ho copiato/incollato ciò che hai scritto e posso leggere il file (stesso nome). In quale codifica è salvato il file sorgente? – ryanday

risposta

0

Queste sono le conclusioni finora:

  1. PHP 5 non è possibile il nome del file aperto con caratteri unicode a meno che il nome del file sorgente è unicode.
  2. PHP 5 (almeno su Windows XP) non è in grado di elaborare il codice sorgente PHP in unicode.

Così la conclusione questo non fattibile in PHP 5.

+0

PHP può aprire un nome file con caratteri non ASCII solo se tutti i caratteri si trovano nella tabella codici predefinita dell'installazione di Windows. Può gestire stringhe letterali contenenti caratteri non ASCII; usa solo i byte diretti, quindi come funziona dipende dalla codifica in cui hai salvato il file sorgente, nel tuo editor di testo. La codifica che molti editor di testo di Windows impropriamente chiamano “Unicode” è, infatti, UTF-16, che, essendo compatibile non-ASCII-, PHP non può affrontare. Vedi [questa domanda] (http://stackoverflow.com/q/482342/18936) per lo sfondo. – bobince

0

Si potrebbe provare:

  • ottenere la stringa per il nome del file da un elenco di directory utilizzando opendir e readdir
  • passaggio che stringa da file_get _contents per vedere se questo funzionerà, o
  • provare a ottenere il contenuto del file utilizzando fopen, fread e fclose

Spero che questo aiuti!

+0

Potresti includere esempi di codice per mostrare come funzionerebbe? –

8

UPDATE (13 luglio '17)

Anche se la documentazione non sembrano parlare di esso, PHP 7.0 e versioni successive supporta Unicode, infine, i nomi dei file su Windows pronto per l'uso. Le API del filesystem di PHP accettano e restituiscono i nomi dei file in base a default_charset, che è UTF-8 per impostazione predefinita.

Fare riferimento a bug fix qui: https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


UPDATE (29 gennaio '15)

Se si ha accesso alla directory di estensioni PHP, è possibile provare a installare php-wfio.dll a https://github.com/kenjiuno/php-wfio, e si riferiscono file tramite il protocollo wfio://.

file_get_contents("wfio://你好.xml"); 

risposta originale

PHP su Windows utilizza il Legacy "API ANSI" esclusivamente per l'accesso ai file locali, il che significa che PHP utilizza il Locale Sistema invece di Unicode.

per accedere ai file i cui nomi di file contengono Unicode, è necessario convertire il nome del file per la codifica specificata per l'attuale sistema Locale. Se il nome del file contiene caratteri che non sono rappresentabili nella codifica specificata, sei fuori di fortuna(Update: Vedere la sezione sopra per una soluzione). scandir tornerà senza senso per questi file e passando la stringa nel fopen e gli equivalenti falliranno.

Per trovare la codifica diritto di utilizzare, è possibile ottenere il locale del sistema chiamando <?=setlocale(LC_TYPE,0)?>, e alzando il Code Page Identifier (il numero dopo il .) presso l'articolo MSDN https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx.

Ad esempio, se la funzione restituisce Chinese (Traditional)_HKG.950, significa che è in uso la codepage 950 e il nome file deve essere convertito nella codifica big-5. In questo caso, il codice dovrà essere come segue, se il file viene salvato in formato UTF-8 (preferibilmente senza BOM):

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

o come segue se si salva direttamente il file come Big-5:

$fname = "你好.xml"; 
file_get_contents($fname); 
+0

Grazie per questo aggiornamento. –

+0

Ciao, puoi dirmi come estrarre il file .zip, che contiene il nome dei file è UTF-8 –

Problemi correlati