por - php scandir only files
problema de php readdir con nombre de archivo de idioma japonés (6)
Reemplace cualquier instancia de $ file con mb_substr ($ file, mb_strrpos ($ file, ''/'') + 1) y debería estar listo para continuar. ¡Hurra para la codificación de múltiples bytes!
Tengo el siguiente código
<?php
if ($handle = opendir(''C:/xampp/htdocs/movies'')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
echo $file."<br />/n";
}
}
closedir($handle);
}
?>
Cuando tiene un lenguaje mb como japonés, no se muestra correctamente sino que se muestra como kyuukyoku Choujin R ????? ~? en lugar de kyuukyoku Choujin R 究 極 る る ~ る
De todos modos, para hacer que muestre el nombre correcto o hacerlo aún descargable por otros?
Gracias por ayudarme :)
Te perdiste otras dos referencias a la variable de archivo $ , amigo, pero eso es para mejor, ya que creo que puedo haber descubierto un método un poco más eficiente; dale una oportunidad:
<?php
if ($handle = opendir(''C:/xampp/htdocs/movies'')) {
while (false !== ($file = readdir($handle))) {
$file = mb_substr($file, mb_strrpos($file, ''/'') + 1);
if ($file != "." && $file != "..") {
echo $file . "<br />/n";
}
}
closedir($handle);
}
?>
Creo que Windows usa UTF-16 para nombres de archivos. Intente la función mb_convert_encoding
para convertir la codificación interna a su codificación de salida:
// convert from UTF-16 to UTF-8
echo mb_convert_encoding($file, ''UTF-8'', ''UTF-16'');
Quizás primero mb_get_info
cambiar algunas configuraciones (consulte mb_get_info
).
lo siento :)
intenta esto:
<?php if ($handle = opendir(''C:/xampp/htdocs/movies'')) { while (false !== ($file = readdir($handle))) { $filename_utf16 = iconv( "iso-8859-1", "utf-16", $file); if ($filename_utf16 != "." && $filename_utf16 != "..") { echo $filename_utf16 . "<br />/n"; } } closedir($handle); } ?>
No puedo hablar de forma definitiva para PHP, pero sospecho que es el mismo problema básico que tenía con Python 2 (antes de agregar soporte especial para los nombres de archivo de cadenas Unicode).
Mi creencia es que PHP está tratando con nombres de archivo usando las funciones estándar de la biblioteca C open''-et-al, que están basadas en bytes. En Windows (NT) estos intentan codificar el nombre de archivo Unicode real utilizando la página de códigos del sistema. Eso podría ser cp1252 (similar a ISO-8859-1) para máquinas occidentales, o cp932 (similar a Shift-JIS) en máquinas japonesas. Para cualquier personaje que no exista en la página de códigos del sistema, obtendrá un ''?'' personaje, y no podrás consultar ese archivo.
Para evitar este problema PHP tendría que hacer lo mismo que Python 3.0 y comenzar a usar cadenas Unicode para nombres de archivos (y todo lo demás), usando las funciones ''_wopen''-et-al para obtener acceso nativo-Unicode a los nombres de archivo bajo Windows. Supongo que esto sucederá en PHP6, pero por el momento probablemente estés bastante recargado. Podrías cambiar la página de códigos del sistema a cp932 para tener acceso a los nombres de los archivos, pero aún obtendrías ''?'' caracteres para cualquier otro carácter Unicode que no esté en Shift-JIS, y en cualquier caso, realmente no desea hacer que las cadenas internas de su aplicación sean todas Shift-JIS ya que es una codificación bastante horrible.
Si se trata de tus propios guiones para elegir cómo almacenar archivos, te sugiero que utilices localmente nombres de archivos basados en claves primarias, como ''4356'', colocando el nombre real en una base de datos y sirviendo los archivos usando reescrituras / trazando partes de la ruta en la URL Mantener los nombres de archivo proporcionados por el usuario en sus propios nombres de archivo locales es difícil y una receta para desastres de seguridad incluso sin tener que preocuparse por Unicode.
Como se mencionó en @bobince, PHP devuelve nombres de archivo en la codificación especificada para la configuración regional del sistema , que es utilizada por aplicaciones no compatibles con Unicode. Si el carácter no existe en la codificación del sistema actual, el nombre de archivo contendrá ''?'' en su lugar y no será accesible.
Puede intentar instalar php-wfio.dll
en https://github.com/kenjiuno/php-wfio , y hacer referencia a los archivos mediante el protocolo wfio://
.