За последние 24 часа нас посетили 18110 программистов и 1734 робота. Сейчас ищут 990 программистов ...

Как работать с русскими буквами в названии файлов?

Тема в разделе "PHP для новичков", создана пользователем borus, 5 июл 2017.

  1. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте!

    Получаю список файлов в папке:
    PHP:
    1.     public function select_files($folder){
    2.         $fp=opendir($folder);
    3.         $internal_array = array();
    4.         while (false !== ($file = readdir($fp))) {
    5.             if(is_file($folder."/".$file)) {
    6.                 $internal_array[] = iconv('windows-1251','UTF-8',$file);
    7.             }
    8.         }
    9.         closedir($fp);
    10.         return $internal_array;
    11.     }
    использую iconv, чтобы на локальном сервере, работающем из под Windows, видеть нормально названия файлов с русскими буквами.
    Вопрос, если этот код будет исполняться где-нибудь на Debian, то навредит ли использование строки iconv('windows-1251','UTF-8',$file)?
    Если да, то как сделать код универсальным, чтобы и из-под Windows и из-под *nix одинаково верно получать список файлов с русскими буквами в названии?
    Дальше некоторые из найденных файлов php-код будет удалять, поэтому нужны их правильные полные имена
     
    #1 borus, 5 июл 2017
    Последнее редактирование: 5 июл 2017
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    миграция на другую операционную систему сама по себе не приводит к перекодированию файлов в другие кодировки.
    Чтобы не думать о таких вопросах, современные проекты давным давно используют единый стандарт UTF-8 для чего оный и был придуман.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    На юниксах тебе не надо конвертировать имя файла. Это особенность реализации PHP на Windows: хотя реально имена файлов в дисковой системе хранятся в уникоде, используется неуникодный вариант файловых функций. Поэтому ты на своей винде с русской локализацией получаешь имена как бы в 1251. Будь ты резидент Германии, получал бы в 1250 и у тебя были бы реальные сложности с русскими именами! Не получается в 8 бит уложить все алфавиты. Вобщем никакой нафиг переносимости решений :(

    Вывод: храни файлы на диске с искусственно генерируемыми именами. А когда надо отдавать на скачку с оригинальным именем, читай его из базы и подставляй в заголовок:
    header('Content-Disposition: attachment; filename="Дурацкое кириллическое имя в UTF-8.pdf"');
     
    Fell-x27 нравится это.
  4. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Доброе утро. Спасибо всем.
    Я вот, правда, не понял, заменять ли мне строку
    PHP:
    1. $internal_array[]=iconv('windows-1251','UTF-8',$file);
    на
    PHP:
    1. $internal_array[]=$file;
    перед тем как размещу на Debian сервере или можно оставить, как есть?
     
  5. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    подсказали, что можно так
    PHP:
    1. $internal_array[] = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')? iconv('windows-1251','UTF-8',$file):$file;
     
  6. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте!
    На Винде функция scandir() для русскоязычных названий файлов возвращает "вопросики" вместо букв, это приводит к проблеме кодировки в json таких названий, а может не это ошибка описывается как (Некорректные символы UTF-8, возможно неверная кодировка).

    Скажите, пожалуйста, если scandir() будет выполняться на юниксах, то вместо русских букв не будет "вопросиков"?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Автор, мне кажется, или тебе надо просто запилить себе линуху с веб-окружением и перестать грызть кактус?
     
  8. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Спасибо за совет. Простите, я плохо разбираюсь в Юниксах, потребуется много времени, чтобы это наладить и освоить, не готов к этому

    Тем не менее вопрос остался: на Юниксах json_encode(scandir('путь_до_папки_с_файлами_с_русскими_буквами')) не будет приводить к false?
     
  9. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Пока сам не проверишь, сам и не узнаешь, но в конце концов, по логике 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'))

    я думаю вряд ли ты сможешь подключить...
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    @borus тебе пора самому попробовать что-то сделать.
    --- Добавлено ---
    чувак, (1) попробовать конкретную строку совсем недолго. это не требует экспертных знаний и (2) перестань думать о форуме как об универсальном решателе проблем. на один годный совет может прийтись 10 негодных — тебе полюбому придется проверить всё самостоятельно.