На входе в скрипт (на бубунте) есть некоторый zip архив, который обрабатывается соответствующим расширением. В архиве существуют файлы с русскими именами. При проходе архива, zip выдаёт названия файлов, например как "䫬π¼Ñ¡Γᵿ∩ áπ¬µ¿«¡á". Поломал голову, https://2cyr.com/decode/?lang=ru выдаёт нужный результат, но дальше я просто чувствую себя нубом и хз что делать. Тщетные попытки наугад выставить аргументы iconv ни к чему не приводят. Вызываю в тред кодировко-богов. --- Добавлено --- Почаны, если у кого есть решение на уровне php/iconv буду признателен. Проблему решил сам, с помощью runzip
Сервис указывает, что исходная кодировка CP866 вот её и нужно ставить первым аргументом iconv('CP866', 'UTF-8', $str); PHP: $zip = zip_open("file.zip"); if ($zip) { while ($zip_entry = zip_read($zip)) { echo "Name: " . iconv('CP866', 'UTF-8', zip_entry_name($zip_entry)) . "\n"; } zip_close($zip); }
Ну ты меня за конченого держишь, да ? Это с ходу было сделано, не робит. Рили. Ты конечно можешь попробовать и если стрельнёт, то укажи параметры окружения.
Эта помойка не решает проблемы. PHP: $list_files = array_filter(explode("//\n", `zipinfo -1 archive.zip`)); Дальше ключ массива = ключ файла в zip. Директории отсекаем, например, по extension.
http://php.net/manual/ru/zip.constants По умолчанию там установлен флаг ZipArchive::FL_ENC_GUESS угадать кодировку строки. В твоем случае не угадывает и портит данные. Можно попробовать передать ZipArchive::FL_ENC_RAW вторым аргументом в getNameIndex. PHP: $z = new ZipArchive(); $z->open('file.zip'); for($i = 0; $i < $z->numFiles; $i++) { echo 'Filename: ' . iconv('CP866', 'UTF-8', $z->getNameIndex($i, ZipArchive::FL_ENC_RAW)) . "\n"; }
@Emilien слушай, ну я придержусь своего варианта, а на счет твоего могу сказать, что название файла не обязательно в CP866. Мне встречались архивы с различными кодировками названий файлов. Тестировать я не стану, но за участие спасибо.