2009-04-02 12 views
11

Vorrei accedere a un file PHP il cui nome contiene caratteri UTF-8.Un nome di file PHP (o una directory nel suo percorso completo) hanno caratteri UTF-8?

Il file non contiene un DB. Contiene solo un'istruzione echo che mostra alcuni caratteri unicode.

Accesso alla pagina PHP dal browser (FireFox 3.0.8, IE7) si traduce in errore HTTP 500.

Ci sono due voci nel log di Apache (file è/க PHP;. La lettera க è un composito uno e corrisponde ai caratteri \ xe0 \ xae \ x95 nel registro sottostante):

[Sab Apr 04 09:30:25 2009] [errore] [client 127.0.0.1] PHP Avviso: sconosciuto: non riuscito open stream: Nessun file o directory in Unknown sulla linea 0

[Sab Apr 04 09:30:25 2009] [errore] [client 127.0.0.1] PHP Errore irreversibile: Sconosciuto: apertura fallita richiesta 'D:/VA/ROOT/\ xe 0 \ xae \ x95.php '(include_path =' .; C: \ php5 \ pear ') in Unknown sulla linea 0

La stessa pagina funziona quando i nomi di file e dir sono in inglese. Nella stessa configurazione, non vi sono problemi nell'utilizzo di SSI per queste pagine.

EDIT

informazioni Rimosso sulla riscrittura degli URL in quanto non sembra essere un fattore.

Quando mod_rewrite viene rimosso, il file PHP continua a non funzionare. Funziona se il file viene rinominato con un nome non UTF. Tuttavia, shtml funziona anche con i caratteri UTF nel nome del file e/o del percorso.

risposta

15

Ho incontrato lo stesso problema e ho fatto qualche ricerca e ho concluso quanto segue. Questo è per php5 su Windows; è probabilmente vero su altre piattaforme ma non ho controllato.

  1. TUTTI php funzioni del file system (dir, is_dir, is_file, lima, filemtime, Archivio dimensioni, file_exists ecc) solo accettare e restituire i nomi di file in ISO-8859-1, a prescindere dalla default_charset impostata nel programma o file ini.

  2. Dove un nome file contiene un carattere unicode dir-> read lo restituirà come il corrispondente carattere ISO-8859-1 se ce n'è uno, altrimenti sostituirà un punto interrogativo.

  3. Quando si fa riferimento a un file, ad es. in is_file o file, se si passa in un nome file UTF-8 il file non verrà trovato quando il nome contiene caratteri a due byte o più. Tuttavia, is_file (utf8_decode ($ filename)) ecc funzionerà fornendo che il carattere UTF-8 sia rappresentabile in ISO-8859-1.

In altre parole, PHP5 non è in grado di affrontare i file con caratteri multi-byte nei loro nomi a tutti.

Se viene richiesto un URL UTF-8 con caratteri multibyte che corrisponde direttamente a un file, PHP non sarà in grado di aprire il file perché non può indirizzarlo.

Se desideri semplicemente URL nella tua lingua, il suggerimento di utilizzare mod_rewrite sembra buono.

Ma se si stanno memorizzando e recuperando file caricati e scaricati dagli utenti, questo problema deve essere risolto. Un modo è utilizzare un nome di file arbitrario (non UTF-8), come un numero incrementale, sul server e indicizzare i file in un database o file XML o alcuni di questi. Un altro modo è quello di memorizzare i file nel database stesso come un BLOB. Un altro modo (che è forse più facile vedere cosa sta succedendo, e non soggetto a problemi se il tuo indice viene corrotto) è quello di codificare i nomi dei file te stesso - una buona tecnica è quella di urlencode (sic) tutti i nomi dei file in arrivo durante l'archiviazione sul server disk e urldecode loro prima di impostare il nome del file nell'intestazione mime per il download. Tutti i personaggi vagamente inusuali (eccetto%) sono quindi codificati come% nn e quindi qualsiasi problema con gli spazi nei nomi di file, il supporto multipiattaforma e la corrispondenza dei modelli sono in gran parte evitati.

+1

si può arrivare php per aprire il file dalla scansione della directory e utilizzando il nome che trova, anche se è in una codifica diversa. –

+0

approfondito, grazie! – Znarkus

+0

http://stackoverflow.com/questions/1525830/how-do-i-use-filesystem-functions-in-php-using-utf-8-strings -> Vorrei controllarlo qui – Revenant

2

Solo perché il set di caratteri è UTF-8 non significa che supporti tutti i caratteri superiori di Unicode.

Il supporto Unicode è una delle principali aggiunte in PHP 6 e PHP 5 è nocciolo per mancanza di supporto Unicode.

Se lo script PHP sta generando il collegamento, potrebbe trattarsi di un problema diverso rispetto al caso in cui Apache stia interpretando l'URL direttamente e reindirizzandolo.

6
  • So per certo lo stesso PHP può lavoro con gli URL Unicode, perché ho provato ad utilizzare i nomi delle pagine Unicode a MediaWiki (basata su PHP, gestisce anche Wikipedia) e funziona. Ad esempio, URL come /index.php/Page_name©. Quindi PHP può gestirlo. Ma potrebbe essere un problema con Apache trovare un file in cui il file sorgente ha un nome UTF-8.

  • L'impostazione PHP.ini per la codifica dei caratteri non dovrebbe influire su questo; è compito del server web trovare una risorsa specifica e quindi chiamare PHP una volta determinato che si tratta di un file PHP. Ciò significa che il server Web e il file system sottostante devono essere in grado di gestire i nomi file UTF-8.

  • Funziona senza la regola mod_rewrite? Cioè, se si disabilita il motore di riscrittura con RewriteEngine disattivato e quindi si richiede va.in/utf_dir/utf_file.php? Se è così, allora potrebbe essere un problema di mod_rewrite config o un problema con la regola.

  • L'Unicode negli URL potrebbe non essere supportato correttamente in alcuni browser quando si digita semplicemente un indirizzo, come i browser più vecchi. I browser meno recenti possono saltare il passaggio di codifica UTF-8.Ciò non dovrebbe impedirgli di funzionare se si sta seguendo un collegamento su una pagina, in cui quella pagina è codificata in UTF-8, comunque.

1

No. I nomi file PHP devono essere in ASCII, non importa come si imposta il server PHP5 non può farcela quindi aspettiamo PHP 6. All'interno di uno script PHP puoi gestire utf-8 filename/url usando utf8_decode . È possibile utilizzare un .htaccess e SQL per aggirare un sacco di problemi, ma non c'è modo di eseguire un nome file unicode.

La risposta di David Earl è corretta.

0

Utilizzare "wfio: //" per copiare scrivere, e.t.c.

https://github.com/kenjiuno/php-wfio

Per cartella:

.htaccess:

php_value auto_prepend_file C:/fix.php

correzione.php:

$file = $_SERVER['SCRIPT_FILENAME']; 
if (!is_readable($file)) { 
    $file="wfio://".$file; 
       include $file; 
       exit; 
     } 

Ma meglio per l'utilizzo del sistema operativo Linux php

Problemi correlati