Здравствуйте! Получаю список файлов в папке: PHP: public function select_files($folder){ $fp=opendir($folder); $internal_array = array(); while (false !== ($file = readdir($fp))) { if(is_file($folder."/".$file)) { $internal_array[] = iconv('windows-1251','UTF-8',$file); } } closedir($fp); return $internal_array; } использую iconv, чтобы на локальном сервере, работающем из под Windows, видеть нормально названия файлов с русскими буквами. Вопрос, если этот код будет исполняться где-нибудь на Debian, то навредит ли использование строки iconv('windows-1251','UTF-8',$file)? Если да, то как сделать код универсальным, чтобы и из-под Windows и из-под *nix одинаково верно получать список файлов с русскими буквами в названии? Дальше некоторые из найденных файлов php-код будет удалять, поэтому нужны их правильные полные имена
миграция на другую операционную систему сама по себе не приводит к перекодированию файлов в другие кодировки. Чтобы не думать о таких вопросах, современные проекты давным давно используют единый стандарт UTF-8 для чего оный и был придуман.
На юниксах тебе не надо конвертировать имя файла. Это особенность реализации PHP на Windows: хотя реально имена файлов в дисковой системе хранятся в уникоде, используется неуникодный вариант файловых функций. Поэтому ты на своей винде с русской локализацией получаешь имена как бы в 1251. Будь ты резидент Германии, получал бы в 1250 и у тебя были бы реальные сложности с русскими именами! Не получается в 8 бит уложить все алфавиты. Вобщем никакой нафиг переносимости решений Вывод: храни файлы на диске с искусственно генерируемыми именами. А когда надо отдавать на скачку с оригинальным именем, читай его из базы и подставляй в заголовок: header('Content-Disposition: attachment; filename="Дурацкое кириллическое имя в UTF-8.pdf"');
Доброе утро. Спасибо всем. Я вот, правда, не понял, заменять ли мне строку PHP: $internal_array[]=iconv('windows-1251','UTF-8',$file); на PHP: $internal_array[]=$file; перед тем как размещу на Debian сервере или можно оставить, как есть?
подсказали, что можно так PHP: $internal_array[] = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')? iconv('windows-1251','UTF-8',$file):$file;
Здравствуйте! На Винде функция scandir() для русскоязычных названий файлов возвращает "вопросики" вместо букв, это приводит к проблеме кодировки в json таких названий, а может не это ошибка описывается как (Некорректные символы UTF-8, возможно неверная кодировка). Скажите, пожалуйста, если scandir() будет выполняться на юниксах, то вместо русских букв не будет "вопросиков"?
Автор, мне кажется, или тебе надо просто запилить себе линуху с веб-окружением и перестать грызть кактус?
Спасибо за совет. Простите, я плохо разбираюсь в Юниксах, потребуется много времени, чтобы это наладить и освоить, не готов к этому Тем не менее вопрос остался: на Юниксах json_encode(scandir('путь_до_папки_с_файлами_с_русскими_буквами')) не будет приводить к false?
Пока сам не проверишь, сам и не узнаешь, но в конце концов, по логике json_encode должен русские символы перевести в нечто "\u0442\u0435\u0441\u0442". И будет выглядеть так: json_encode(scandir('\u043f\u0443\u0442\u044c_\u0434\u043e_\u043f\u0430\u043f\u043a\u0438_\u0441_\u0444\u0430\u0439\u043b\u0430\u043c\u0438_\u0441_\u0440\u0443\u0441\u0441\u043a\u0438\u043c\u0438_\u0431\u0443\u043a\u0432\u0430\u043c\u0438.php')) я думаю вряд ли ты сможешь подключить...
@borus тебе пора самому попробовать что-то сделать. --- Добавлено --- чувак, (1) попробовать конкретную строку совсем недолго. это не требует экспертных знаний и (2) перестань думать о форуме как об универсальном решателе проблем. на один годный совет может прийтись 10 негодных — тебе полюбому придется проверить всё самостоятельно.