У меня есть следующий код
<?php if ($handle = opendir('C:/xampp/htdocs/movies')) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { echo $file."<br />\n"; } } closedir($handle); } ?>
Когда у него есть язык mb, такой как japanese, он отображается неправильно, а отображается как kyuukyoku Choujin R ????? ~? а не kyuukyoku Choujin R 究 極 超人 あ ~ る
В любом случае, чтобы отобразить правильное имя или сделать его еще доступным для загрузки другими?
Спасибо за помощь 🙂
Я не могу говорить окончательно для PHP, но я подозреваю, что это та же самая основная проблема, что и у Python 2 (до того, как позднее добавлена специальная поддержка имен файлов Unicode).
Я убежден, что PHP имеет дело с именами файлов, использующими стандартные функции библиотеки C open'-et-al, базирующиеся на байтах. В Windows (NT) они пытаются закодировать настоящее имя файла Unicode, используя кодовую страницу системы. Это может быть cp1252 (аналогично ISO-8859-1) для западных машин, или cp932 (аналогично Shift-JIS) на японских машинах. Для любых символов, которые не существуют в кодовой странице системы, вы получите «?» символ, и вы не сможете обратиться к этому файлу.
Чтобы обойти эту проблему, PHP должен был бы сделать то же самое, что и Python 3.0, и начать использовать строки Unicode для имен файлов (и всего остального), используя функции «_wopen'-et-al», чтобы получить собственный доступ к Unicode к именам файлов под Windows. Я ожидаю, что это произойдет в PHP6, но на данный момент вы, вероятно, довольно много набиты. Вы можете изменить системную кодовую страницу на cp932, чтобы получить доступ к именам файлов, но вы все равно получите?? символов для любых других символов Unicode, но не в Shift-JIS, и в любом случае вы действительно не хотите, чтобы внутренние строки вашего приложения были все Shift-JIS, поскольку это довольно ужасная кодировка.
Если это ваши собственные сценарии, выбирающие, как хранить файлы, я бы настоятельно предложил использовать простые имена на основе первичных ключей, например, «4356», поместить реальное имя файла в базу данных и обслуживать файлы с использованием переписывающих / трейлинг-частей в URL. Сохранение пользовательских имен файлов в ваших собственных локальных именах файлов является сложным и представляет собой рецепт для систем безопасности, даже не беспокоясь о Unicode.
Как упоминал @bobince, PHP возвращает имена файлов в указанной кодировке для System Locale , которая используется приложениями, не поддерживающими Unicode. Если символ не существует в текущей системной кодировке, имя файла будет содержать '?' вместо этого и не будет доступным.
Вы можете попробовать установить php-wfio.dll
адресу https://github.com/kenjiuno/php-wfio и обратиться к файлам через протокол wfio://
.
Вы пропустили еще две ссылки на переменную $ file , приятель, но это к лучшему, так как я думаю, что я обнаружил несколько более эффективный метод; попробуйте:
<?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); } ?>
Замените любой экземпляр файла $ mb_substr ($ file, mb_strrpos ($ file, '/') + 1), и вам должно быть хорошо идти. Huzzah для многобайтовой кодировки!
Я думаю, что Windows использует UTF-16 для имен файлов. Поэтому попробуйте функцию mb_convert_encoding
для преобразования из внутренней кодировки в выходную кодировку:
// convert from UTF-16 to UTF-8 echo mb_convert_encoding($file, 'UTF-8', 'UTF-16');
Возможно, сначала вам нужно изменить некоторые настройки (см. mb_get_info
).
Извини 🙂
пытается это:
<?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); } ?>