2009-04-02 10 views
11

Me gustaría acceder a un archivo PHP cuyo nombre tenga caracteres UTF-8.¿Puede un nombre de archivo PHP (o un directorio en su ruta completa) tener caracteres UTF-8?

El archivo no tiene una lista de materiales en él. Solo contiene una declaración de eco que muestra algunos caracteres Unicode.

Acceso a la página PHP desde el navegador (Firefox 3.0.8, IE7) da lugar a error HTTP 500.

Hay dos entradas en el registro de Apache (archivo es/க php;. க la letra es una compuesto uno y corresponde a los caracteres \ xe0 \ xae \ x95 en el registro a continuación):

[sáb 04 abr 2009 09:30:25 2009] [error] [cliente 127.0.0.1] PHP Advertencia: Desconocido: no se pudo abrir secuencia: No existe ningún archivo o directorio en Desconocido en la línea 0

[sáb 04 abr. 09:30:25 2009] [error] [cliente 127.0.0.1] PHP Error grave: Desconocido: Falló la apertura requerida 'D:/va/ROOT/\ xe 0 \ xae \ x95.php '(include_path ='. C: \ php5 \ pear ') en Desconocido en la línea 0

La misma página funciona cuando los nombres de archivo y dir están en inglés. En la misma configuración, no hay ningún problema al usar SSI para estas páginas.

EDITAR

información Eliminado en la reescritura de URL, ya que no parece ser un factor.

Cuando se elimina mod_rewrite, el archivo PHP aún no funciona. Funciona si el archivo se renombra a un nombre que no sea UTF. Sin embargo, shtml funciona incluso con caracteres UTF en archivos y/o nombre de ruta.

Respuesta

15

He encontrado el mismo problema y he hecho algunas investigaciones y concluyo lo siguiente. Esto es para php5 en Windows; probablemente sea cierto en otras plataformas, pero no lo he comprobado.

  1. funciones del sistema de archivos TODO php (dir, is_dir, is_file, archivo, filemtime, tamaño del archivo, file_exists etc) sólo se acepten y devolver los nombres de archivo en la norma ISO-8859-1, con independencia de la default_charset establecido en el programa o archivos ini.

  2. Donde un nombre de archivo contiene un carácter unicode dir-> read lo devolverá como el carácter ISO-8859-1 correspondiente si hay uno, de lo contrario sustituirá un signo de interrogación.

  3. Al hacer referencia a un archivo, p. en is_file o file, si transfiere un nombre de archivo UTF-8, el archivo no se encontrará cuando el nombre contenga dos bytes o más caracteres. Sin embargo, is_file (utf8_decode ($ filename)) etc funcionará siempre que el carácter UTF-8 sea representable en ISO-8859-1.

En otras palabras, PHP5 no es capaz de direccionar archivos con caracteres multibyte en sus nombres.

Si se solicita una URL UTF-8 con caracteres multibyte y esto corresponde directamente a un archivo, PHP no podrá abrir el archivo porque no puede abordarlo.

Si simplemente desea URL bonitas en su idioma, la sugerencia de usar mod_rewrite parece ser una buena.

Pero si está almacenando y recuperando archivos cargados y descargados por los usuarios, este problema debe ser resuelto. Una forma es usar un nombre de archivo arbitrario (no UTF-8), como un número creciente, en el servidor e indexar los archivos en una base de datos o archivo XML o algo similar. Otra forma es almacenar los archivos en la base de datos como un BLOB. Otra forma (que tal vez sea más fácil de ver lo que está sucediendo, y no está sujeta a problemas si su índice se corrompe) es codificar los nombres de archivo usted mismo - una buena técnica es urlencode (sic) todos los nombres de archivos entrantes cuando se almacena en el servidor disk y urldecode them antes de configurar el nombre de archivo en el encabezado mime para la descarga. Todos los caracteres incluso vagamente inusuales (excepto%) se codifican como% nn y, por lo tanto, se evita en gran medida cualquier problema con los espacios en los nombres de los archivos, el soporte multiplataforma y la coincidencia de patrones.

+1

, usted puede obtener php para abrir el archivo mediante el escaneo del directorio y usando el nombre que encuentra incluso si se trata de una codificación diferente. –

+0

completo, gracias! – Znarkus

+0

http://stackoverflow.com/questions/1525830/how-do-i-use-filesystem-functions-in-php-using-utf-8-strings -> Lo verificaría aquí – Revenant

2

El hecho de que el conjunto de caracteres sea UTF-8 no significa que admite todos los caracteres superiores de Unicode.

La compatibilidad con Unicode es una de las principales adiciones que viene en PHP 6 y PHP 5 es muy útil por carecer de compatibilidad con Unicode.

Si su script PHP está generando el enlace, puede ser un problema diferente que si apache interpreta la url directamente y la redirecciona.

6
  • sé que es un hecho el propio PHP puede trabajo con las direcciones URL Unicode, porque he intentado usar los nombres de página Unicode en MediaWiki (basado en PHP, también se ejecuta Wikipedia) y funciona. Por ejemplo, URLs como /index.php/Page_name©. Entonces PHP puede manejarlo. Pero puede ser un problema con Apache encontrar un archivo donde el archivo fuente tenga un nombre UTF-8.

  • El ajuste PHP.ini para la codificación de caracteres no debería afectar esto; el trabajo del servidor web es encontrar un recurso específico y luego llamar a PHP una vez que se determine que es un archivo PHP. Significará que el servidor web, y el sistema de archivos subyacente en sí, deben poder tratar con los nombres de archivo UTF-8.

  • ¿Funciona sin la regla mod_rewrite? Es decir, si desactiva el motor de reescritura con RewriteEngine desactivado y luego solicita va.in/utf_dir/utf_file.php? Si es así, puede ser un problema de configuración de mod_rewrite o un problema con la regla.

  • Las URL Unicode pueden no ser compatibles en algunos navegadores cuando ingresa una dirección, como navegadores más antiguos. Los navegadores antiguos pueden omitir el paso de codificación UTF-8.Esto no debería impedir que funcione si sigue un enlace en una página, aunque esa página está codificada en UTF-8.

1

No. Los nombres de archivo PHP deben estar en ASCII, no importa cómo configure su servidor PHP5 no puede funcionar, entonces esperamos PHP 6. Dentro de un script PHP puede manejar utf-8 filename/url usando utf8_decode . Puede utilizar .htaccess y SQL para evitar muchos problemas, pero no hay forma de ejecutar un nombre de archivo Unicode.

La respuesta de David Earl es correcta.

0

Utilice "wfio: //" para copiar escribir, e.t.c.

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

Por carpeta:

.htaccess:

php_value auto_prepend_file C:/fix.php

solución.php:

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

Pero mejor para el uso php sistema operativo Linux

Cuestiones relacionadas