Esto está relacionado con esta publicación de desbordamiento de pila:
glob () no puede encontrar nombres de archivo con caracteres multibyte en Windows?
Tengo problemas con PHP y archivos que tienen caracteres multibyte en Windows. Aquí está mi caso de prueba:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Salida correcta en el servidor UNIX remoto:
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
)
Salida incorrecta localmente 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
)
Aquí hay un extracto relevante de la respuesta que elegí aceptar (que en realidad es una cita de un artículo publicado en línea hace más de 2 años):
De los comentarios sobre este artículo: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
El resultado de su instalación de PHP en Windows es fácil de explicar: instaló una versión incorrecta de PHP y utilizó una versión no compilada para utilizar la versión Unicode de la API Win32. Por esta razón, las llamadas al sistema de archivos utilizadas por PHP utilizarán la API "ANSI" heredada, por lo que las bibliotecas C / C ++ vinculadas con esta versión de PHP primero intentarán convertir su cadena PHP codificada en UTF-8 en la "ANSI" local. página de códigos seleccionada en el entorno de ejecución (consulte el comando CHCP antes de iniciar PHP desde una ventana de línea de comandos)
Su versión de Windows NO ES PROBABLEMENTE responsable de esta cosa extraña. En realidad, esta es SU versión de PHP que no está compilada correctamente, y que usa la versión ANSI heredada de la API Win32 (por compatibilidad con las versiones heredadas de 16 bits de Windows 95/98 cuyo soporte de sistema de archivos en el núcleo en realidad no tenía soporte para Unicode, pero usó una capa de conversión interna para convertir Unicode a la página de códigos ANSI local antes de usar la versión ANSI real de la API).
Vuelva a compilar PHP usando la opción de compilación para usar la versión UNICODE de la API Win32 (que debería ser la predeterminada hoy, y de todos modos siempre la predeterminada para PHP instalado en un servidor que NUNCA será Windows 95 o Windows 98 ...)
No puedo confirmar si este es mi problema o no. Usé phpinfo()
y no encontré nada interesante, pero no estaba seguro de qué buscar. He estado usando XAMPP para facilitar las instalaciones, por lo que realmente no estoy seguro de cómo se instaló.
Estoy usando Windows 7, 64 bits, así que perdona mi ignorancia, pero ni siquiera estoy seguro de si "Win32" es relevante aquí. ¿Cómo puedo verificar si mi versión actual de PHP se compiló con la configuración mencionada anteriormente?
- Versión PHP : 5.3.8
- Sistema : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Fecha de construcción : 23 de agosto de 2011 11:47:20
- Compilador : MSVC9 (Visual C ++ 2008)
- Arquitectura : x86
- Configurar comando :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
En caso de que sea relevante o revele información útil, aquí hay una captura de pantalla de mi phpinfo()
(sección mbstring):
¿Cómo puedo saber si mi instalación de PHP fue "compilada con la versión UNICODE de la API Win32"? (¿Y eso tiene sentido?)