Estoy escribiendo un gestor de archivos y necesito escanear directorios y lidiar con el renombramiento de archivos que pueden tener caracteres multibyte. Estoy trabajando en ello localmente en Windows/Apache PHP 5.3.8, con los siguientes nombres de archivos en un directorio:
- nombre de archivo.jpg
- имяфайла.jpg
- file件name.jpg
- פילענאַמע.jpg
- 文件名.jpg
Las pruebas en un servidor UNIX vivo funcionaron bien. Probando localmente en Windows usando glob('./path/*')
devuelve sólo la primera, filename.jpg
.
Utilizando scandir()
se devuelve al menos el número correcto de archivos, pero obtengo nombres como ?????????.jpg
(nota: son signos de interrogación normales, no el carácter �.
Acabaré necesitando escribir una función de "búsqueda" para buscar recursivamente en todo el árbol los nombres de archivo que coincidan con un patrón o con una determinada extensión de archivo, y supuse que glob()
sería la herramienta adecuada para ello, en lugar de escanear todo los archivos y hacer la coincidencia de patrones y la construcción de Array en el código de la aplicación. Estoy abierto a sugerencias alternativas si es necesario.
Asumiendo que se trataba de un problema común, inmediatamente busqué en Google y en Stack Overflow y no encontré nada relacionado. ¿Es un problema de Windows? ¿Defecto de PHP? ¿Cuál es la solución: hay algo que pueda hacer?
Adenda: No estoy seguro de qué relación tiene esto, pero file_exists()
también regresa FALSE
para estos archivos, pasando la ruta absoluta completa (usando el Notepad++, el archivo PHP en sí mismo está codificado en UTF-8 sin BOM). Estoy seguro de que la ruta es correcta, ya que los archivos vecinos sin caracteres multibyte devuelven TRUE
.
EDITAR : glob()
puede encontrar un archivo llamado filename-äöü.jpg
. Anteriormente en mi .htaccess
archivo, tenía AddDefaultCharset utf-8
que no había tenido en cuenta antes. filename-äöü.jpg
estaba imprimiendo como filename-���.jpg
. El único efecto que parece tener la eliminación de esa línea htaccess es que ahora el nombre del archivo se imprime normalmente.
He borrado el .htaccess
completamente, y este es mi prueba real script en su totalidad (he cambiado un par de nombres de archivo del post original):
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Salida local en Windows:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
Salida en el servidor remoto UNIX:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Dado que se trata de un servidor diferente, independientemente de la plataforma - la configuración podría ser diferente, así que no estoy seguro de qué pensar, y no puedo totalmente pin en Windows todavía (podría ser mi instalación de PHP, la configuración ini, o la configuración de Apache). ¿Alguna idea?