Работа с японскими именами файлов в PHP 5.3 и Windows Vista?

В настоящее время я пытаюсь написать простой скрипт, который выглядит в папке, и возвращает список всех имен файлов в фиде RSS. Однако я попал в большую стену … Всякий раз, когда я пытаюсь читать имена файлов с японскими символами, они показывают их как. Я пробовал решения, упомянутые здесь: проблема с php readdir с японским именем файла языка – однако они почему-то не работают, даже с:

header('Content-Type: text/html; charset=UTF-8'); setlocale(LC_ALL, 'en_US.UTF8'); mb_internal_encoding("UTF-8"); 

Вверху (Экспортирование в виде обычного текста, пока я не смогу сортировать его).

Что я могу сделать? Мне нужно, чтобы это работало, и у меня мало времени.

Вы можете сделать это на PHP. Напишите небольшую программу C, чтобы читать каталоги и вызывать эту программу с PHP.

См. Также: http://en.literateprograms.org/Directory_listing_(C,_Windows) http://www.daniweb.com/forums/thread74944.html http://forums.devshed.com/c-programming-42/ чтение-а-каталог-в-окна-36169.html

 function fx_dir_utf8 ($path) { // use this as failback on windows for usual dir listing // give it a UTF-8 path and receive a UTF-8 listing $path = iconv ('UTF-8', 'UTF-16LE', $path); $cmd = 'cmd /U /C dir '. str_replace ('/', '\\', $path); // windows command line returns CP850 or UTF-16LE $dir_str = shell_exec ($cmd); $dir_str = iconv ('UTF-16LE', 'UTF-8', $dir_str); print_r ($dir_str); // further parse $dir_str return ($dir_str); } 

Это невозможно. Это ограничение самого PHP. PHP не использует широкие вызовы API WIN32, поэтому вы ограничены кодовой страницей. UTF-8 (65001) не подходит для этой цели.

Если вы установите контрольную readdir_r() в readdir_r() в win32\readdir.c , вы увидите, что FindNextFile уже возвращает имя файла с вопросительными знаками вместо символов, которые вы хотите, поэтому вы ничего не можете с этим поделать, кроме исправления PHP сам.

Это отображает японские имена файлов на сервере Windows

 if ($handle = opendir($this->dir)) { while (false !== ($file = readdir($handle))){ $name = mb_convert_encoding($file, "UTF-8", "SJIS-win" ); echo "$name<br>"; } closedir($handle); } 

Да, нет, как утверждают другие, PHP НЕ МОЖЕТ это сделать … Позор вам PHP!

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

Некоторые предложили C, но лично я нашел Python намного более простым / привлекательным (здесь Python3).

** УБЕДИТЕСЬ, ЧТОБЫ САНИТАТЬ ВАШИ ПЕРЕМЕННЫЕ ПЕРЕД ИСПОЛЬЗОВАНИЕМ ЭТОГО **

 $success = (bool)(int)shell_exec('python -c "import os;'. 'os.chdir(\''.$dir.'\'); '. 'import urllib.parse; '. 'file_list = tuple(map(urllib.parse.quote_plus, os.listdir())); '. 'print(int(\''.urlencode($_GET['src']).'\' in file_list and \''.urlencode($_GET['src'].'.part').'\' not in file_list))"' ); 

Да, не очень, но этот фрагмент позволил мне проверить имена файлов с помощью urlencode .

( Ndla: этот конкретный фрагмент использовался, чтобы узнать, когда файл был загружен с помощью Firefox без необходимости связываться с API. Не лучший, а WORKING и быстро настроить)