mostrar - PHP scandir() y htmlentities(): problemas con charset y/o caracteres especiales
mostrar ñ en php (1)
Mi mejor suposición es que el nombre de archivo no está usando UTF-8. O al menos scandir()
no lo está recogiendo así.
Tal vez mb_detect_encoding()
puede arrojar algo de luz?
var_dump(mb_detect_encoding($filename));
Si no, intente adivinar la codificación (CP1252 o ISO-8859-1 sería mi primera suposición) y conviértala a UTF-8, fíjese si la salida es válida:
var_dump(mb_convert_encoding($filename, ''UTF-8'', ''Windows-1252''));
var_dump(mb_convert_encoding($filename, ''UTF-8'', ''ISO-8859-1''));
var_dump(mb_convert_encoding($filename, ''UTF-8'', ''ISO-8859-15''));
O usando iconv()
:
var_dump(iconv(''WINDOWS-1252'', ''UTF-8'', $filename));
var_dump(iconv(''ISO-8859-1'', ''UTF-8'', $filename));
var_dump(iconv(''ISO-8859-15'', ''UTF-8'', $filename));
Luego, cuando haya descubierto qué codificación se utiliza en realidad, su código se verá algo así (suponiendo CP1252):
$filename = htmlentities(mb_convert_encoding($filename, ''UTF-8'', ''Windows-1252''), ENT_QUOTES, ''UTF-8'');
Estoy usando jqueryFileTree para mostrar una lista de directorios en el servidor con enlaces de descarga a los archivos en el directorio. Recientemente me encontré con un problema con los archivos que contienen caracteres especiales:
- test.pdf: funciona bien
- tést.pdf: no funciona (observe el é - acento agudo - en el nombre del archivo)
Al depurar el conector php de jqueryFileTree, veo que está haciendo un scandir () del directorio pasado a través de $ _GET, y luego recorriendo cada archivo / directorio del directorio. Antes de analizar el nombre del archivo en la url, la secuencia de comandos parece realizar correctamente un htmlentities () sobre el nombre del archivo. El problema parece ser que esta llamada a htmlentities ($ file) simplemente devuelve una cadena vacía, que de acuerdo con los documentos php, este puede ser el caso cuando la cadena de entrada contiene una unidad de código no válida dentro de la codificación dada. Sin embargo, intenté pasar el juego de caracteres implícitamente llamando:
$file = htmlentities($file,ENT_QUOTES,''UTF-8'');
Pero esto también devuelve una cadena vacía.
Si llamo: $ file = htmlentities ($ file, ENT_IGNORE, ''UTF-8''); El carácter agudo e simplemente se descarta (por lo que tést.pdf pasa a ser tst.pdf)
Al depurar mi script php con xdebug, puedo ver que la cadena fuente contiene un carácter desconocido (se parece a esto ).
Así que estoy completamente loco aquí para encontrar la solución para esto. Cualquier ayuda sera bienvenida.
FYI:
- El juego de caracteres de mi página es UTF-8 (especificado en metadatos)
- El archivo se almacena en un servidor de archivos de Windows 2003 y scandir () se ejecuta con la ruta UNC (ej. // servidor de archivos / nombre compartido / fuente)
- La codificación predeterminada en mi php.ini está configurada en UTF-8
- El servidor web y PHP 5.4.26 se ejecutan en un servidor de Windows 2008 R2