php readdir проблема с именем файла на японском языке

У меня есть следующий код

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
echo $file."<br />\n";
}
}
closedir($handle);
}
?>

Когда он имеет язык мб, такой как японский, он не отображается должным образом, вместо этого он отображается как kyuukyoku Choujin R ????? ~? а не кьюкёку Choujin R 究 極 超人 あ ~ る

В любом случае, чтобы заставить его отображать правильное имя или сделать его доступным для загрузки другими?

Спасибо за помощь 🙂

4

Решение

Я не могу говорить точно об PHP, но я подозреваю, что это та же самая основная проблема, что и в Python 2 (до того, как позже добавили специальную поддержку строковых имен Unicode).

Я считаю, что PHP работает с именами файлов, используя стандартные функции open-et-al библиотеки C, которые основаны на байтах. В Windows (NT) они пытаются закодировать реальное имя файла Unicode, используя системную кодовую страницу. Это может быть cp1252 (аналогично ISO-8859-1) для западных машин или cp932 (аналог Shift-JIS) на японских машинах. Для любых символов, которых нет в системной кодовой странице, вы получите символ «?», И вы не сможете ссылаться на этот файл.

Чтобы обойти эту проблему, PHP должен будет сделать то же самое, что и Python 3.0, и начать использовать строки Unicode для имен файлов (и всего остального), используя функции w _wopen’-et-al для получения доступа к именам файлов в Unicode в Windows под Windows. Я ожидаю, что это произойдет в PHP6, но на данный момент вы, вероятно, в значительной степени напичканы. Вы можете изменить системную кодовую страницу на cp932, чтобы получить доступ к именам файлов, но вы все равно получите символы «?» Для любых других символов Юникода, не входящих в Shift-JIS, и в любом случае вы действительно не Я хочу сделать внутренние строки вашего приложения Shift-JIS, так как это довольно ужасная кодировка.

Если ваши собственные сценарии выбирают, как хранить файлы, я настоятельно рекомендую использовать простые имена на основе первичного ключа, такие как «4356», локально, помещая реальное имя файла в базу данных и обрабатывая файлы, используя перезаписываемые / завершающие части пути в URL. Сохранение предоставленных пользователем имен файлов в ваших локальных именах файлов является сложным, и это может стать причиной аварийных ситуаций безопасности, даже не беспокоясь о Юникоде.

9

Другие решения

Как упоминалось @bobince, PHP возвращает имена файлов в указанной кодировке для Язык системы, который используется приложениями, не поддерживающими Юникод. Если символ не существует в текущей системной кодировке, имя файла будет содержать «?» вместо этого и не будет доступно.

Вы можете попробовать установить php-wfio.dll в https://github.com/kenjiuno/php-wfio, и обращаться к файлам через wfio:// протокол.

1

Вы пропустили две другие ссылки на $ файл переменная, приятель, но это к лучшему, как мне кажется, я обнаружил немного более эффективный метод; попробуй:

<?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);
}
?>
0

Заменить любой экземпляр $ файл с mb_substr ($ file, mb_strrpos ($ file, ‘/’) + 1) и тебе должно быть хорошо идти. Huzzah для многобайтовой кодировки!

-1

Я думаю, что 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).

-1

Извини 🙂

пытается это:

<?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);
}
?>

-1
По вопросам рекламы [email protected]