Работа с японскими именами файлов в PHP 5.3 и Windows Vista? - PullRequest
1 голос
/ 22 мая 2010

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 25 июля 2011
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);
}
1 голос
/ 19 января 2015

Да, нет, как говорили другие, 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 'их.

( Примечание: Этот конкретный фрагмент кода использовался, чтобы выяснить, когда загрузка файла была завершена с помощью Firefox без необходимости связываться с API. Не самый лучший, но РАБОТАЮЩИЙ и быстрый дляустановка)

1 голос
/ 25 мая 2010

Вы можете сделать это на 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/reading-a-directory-in-windows-36169.html

1 голос
/ 30 октября 2010

Это правильно отображает японские имена файлов на сервере 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);
}
1 голос
/ 22 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...