2010-04-21 26 views
6

Uso caracteres especiales (letras suecas åäö).caracteres especiales en el problema "file_exists" (php)

Ahora, tengo algunas carpetas, que contienen imágenes para los clasificados. Las carpetas se nombran por categoría.

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'); 
     } 
    } 

Permito hasta 5 imágenes en mi sitio, cada una terminando con un nr 1-5. Sin embargo, mi problema es esto, siempre que el nombre de la carpeta tenga un carácter especial, file_exists devuelve falso, es decir, no encuentra el archivo. Aunque está allí.

Todos los documentos están en formato utf-8.

Esto funciona cuando no hay caracteres especiales en los nombres de las carpetas.

Si necesita más de entrada que me haga saber

+0

¿Qué sistema operativo está utilizando? – zaf

+0

wampserver, en máquina local, Windows –

Respuesta

22

¿Cuál es el sistema operativo del servidor?

Si es Windows, no podrá acceder a los archivos con un nombre de archivo codificado en UTF-8, porque la implementación de Windows de las bibliotecas C IO utilizadas por PHP solo hablará en la página de códigos predeterminada del sistema. Para instalaciones de Europa Occidental, que es la página de códigos 1252. Puede convertir una cadena UTF-8 a CP1252 usando iconv:

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

(utf8_decode también podrían utilizarse, pero sería dar resultados erróneos para los caracteres de extensión de Windows que se asignan en el rango de 0x80-0x9F en cp1252.)

Los archivos cuyos nombres incluyen caracteres fuera del repertorio de la página de códigos del sistema (por ejemplo, griego en un recuadro occidental) no pueden accederse en absoluto por PHP y otros programas que usan el stdio. Existen lenguajes de scripting que pueden usar nombres de archivos Unicode nativos a través de las API de Win32, pero PHP5 no es uno de ellos.

Y, por supuesto, el paso anterior no se debe utilizar cuando se implementa en un sistema operativo diferente donde el sistema de archivos está codificado en UTF-8. (es decir, Linux moderno.)

Si necesita compatibilizar a través del servidor sin problemas con PHP, deberá abstenerse de utilizar caracteres que no sean ASCII en los nombres de archivo. Lo siento.

+0

Me encuentro con este problema en un sistema que, debido a los requisitos de casos de uso, * debe * estar alojado en una máquina con Windows, y * debe * contender con archivos que tienen caracteres fuera de la página de códigos 1252 . Descubrí que las bibliotecas 'DirectoryIterator' y' SplFileInfo' pueden interactuar con estos archivos. 'iconv' arroja advertencias sobre caracteres inválidos, y' file_exists' fallará en muchas circunstancias. +1 de parte mía por ponerme en la pista que eventualmente condujo a nuestra solución de medición a medias, y de nuevo notar que 'SplFileInfo' parece ser una solución más universal. –

+0

alternativamente carácter de url que reemplaza los caracteres especiales en sus nombres de archivo puede ser una buena solución. – user544262772

+0

No puedo enfatizar lo suficiente: "** ... Si necesita ser compatible con todos los servidores compatibles con PHP, deberá abstenerse de utilizar caracteres que no sean ASCII en los nombres de archivo ... **" –