За последние 24 часа нас посетили 20773 программиста и 1714 роботов. Сейчас ищут 1662 программиста ...

Кодировка названий файлов zip

Тема в разделе "PHP для профи", создана пользователем Abyss, 4 окт 2017.

Метки:
  1. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    На входе в скрипт (на бубунте) есть некоторый zip архив, который обрабатывается соответствующим расширением. В архиве существуют файлы с русскими именами. При проходе архива, zip выдаёт названия файлов, например как "䫬π¼Ñ¡Γᵿ∩ áπ¬µ¿«¡á".
    Поломал голову, https://2cyr.com/decode/?lang=ru выдаёт нужный результат, но дальше я просто чувствую себя нубом и хз что делать. Тщетные попытки наугад выставить аргументы iconv ни к чему не приводят.
    Вызываю в тред кодировко-богов.
    --- Добавлено ---
    Почаны, если у кого есть решение на уровне php/iconv буду признателен.
    Проблему решил сам, с помощью runzip
     
    denis01 нравится это.
  2. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Сервис указывает, что исходная кодировка CP866 вот её и нужно ставить первым аргументом iconv('CP866', 'UTF-8', $str);
    PHP:
    1. $zip = zip_open("file.zip");
    2.  
    3. if ($zip) {
    4.   while ($zip_entry = zip_read($zip)) {
    5.     echo "Name:  " . iconv('CP866', 'UTF-8', zip_entry_name($zip_entry)) . "\n";
    6.   }
    7.   zip_close($zip);
    8. }
     
    Abyss нравится это.
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Ну ты меня за конченого держишь, да ?
    Это с ходу было сделано, не робит. Рили. Ты конечно можешь попробовать и если стрельнёт, то укажи параметры окружения.
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Эта помойка не решает проблемы.

    PHP:
    1. $list_files =  array_filter(explode("//\n", `zipinfo -1 archive.zip`));
    Дальше ключ массива = ключ файла в zip. Директории отсекаем, например, по extension.
     
  5. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    http://php.net/manual/ru/zip.constants
    По умолчанию там установлен флаг ZipArchive::FL_ENC_GUESS угадать кодировку строки. В твоем случае не угадывает и портит данные.
    Можно попробовать передать ZipArchive::FL_ENC_RAW вторым аргументом в getNameIndex.
    PHP:
    1. $z = new ZipArchive();
    2. $z->open('file.zip');
    3.  
    4. for($i = 0; $i < $z->numFiles; $i++)
    5. {
    6.     echo 'Filename: ' .  iconv('CP866', 'UTF-8', $z->getNameIndex($i, ZipArchive::FL_ENC_RAW)) . "\n";
    7. }
     
    Abyss нравится это.
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    @Emilien слушай, ну я придержусь своего варианта, а на счет твоего могу сказать, что название файла не обязательно в CP866. Мне встречались архивы с различными кодировками названий файлов. Тестировать я не стану, но за участие спасибо.