Задать вопрос
DieZeeL
@DieZeeL
PHP Developer, DevOps

PHP Как перекодировать имена файлов с кириллицей при извлечении из zip архива?

Ребята, помогите, 2 день бьюсь над перекодировкой имен файлов при извлечении из zip архива.
вот сам код:
$zip = new ZipArchive();
$state = $zip->open('test.zip');
if ($state === true) {
    for ($i = 0; $i < $zip->numFiles; ++$i) {
        //skip if folder
        $stats = $zip->statIndex($i);
        if ($stats['size'] === 0 && $stats['crc'] === 0) {
            continue;
        }
        $name = $zip->getNameIndex($i);
        $content = $zip->getFromIndex($i);
    }
    $zip->close();
}
unset($zip);

Всегда получаю какие-то исковерканные имена. по типу:
䫬π¼Ñ¡Γᵿ∩ ¬ Γ«αúá¼ Çαßᬿ ŽÑσá¡δ


Перекодировки из и в cp1251, cp866, IBM437 и других не помогли, или я не нашел нужную комбинацию :(
вот тестовый архив, с которым я пытался работать: Архив
на домашней машине WIn у меня: PHP 7.1.7 и
LC_COLLATE=C;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C

на сервере у меня Debian 9 PHP 7.1.18 и
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
  • Вопрос задан
  • 2105 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 2
DieZeeL
@DieZeeL Автор вопроса
PHP Developer, DevOps
Частично удалось получить 1й результат вот таким извращением:
$name = iconv('UTF-8', 'cp1252//IGNORE', $zip->getNameIndex($i));
$name = iconv('cp1252', 'cp850//IGNORE', $name);
$name = iconv('cp866','UTF-8//IGNORE',$name);

но получается вот такая вот байда:
Докменаци к огам Асаки Плеан/Ак деекации.pdf

Хотя должно быть:
Документация к торгам Арсаки Плеханы/Акт дефектации.pdf


P.S. Методом научного тыка подобрал кодировки.
$name = iconv('UTF-8', 'cp437//IGNORE', $zip->getNameIndex($i));
        $name = iconv('cp437', 'cp865//IGNORE', $name);
        $name = iconv('cp866','UTF-8//IGNORE',$name);

Может кому пригодиться.
Ответ написан
@borovinskiy
Не понятно, зачем UTF-8 вначале в CP437 конвертировать, а затем из CP437 в CP865.

Вот здесь есть решение: https://ru.stackoverflow.com/questions/606882

$name = $zip->getNameIndex($i, \ZipArchive::FL_ENC_RAW);
$name = iconv('cp866','UTF-8//IGNORE',$name);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы