23
Дек
2016

PHP+ZipArchive+РусскийЯзык=Кракозябры

Здравствуйте. Помогите решить проблему: есть zip-архив неизвестно где и как созданный, нужно распаковать все файлы во вложенную папку, причем файлы в архиве имеют имена, содержащие русские буквы. Пробовал так:

$zip = new ZipArchive;
$zip->open($uploadfile);
$dir = $uploaddir . basename($uploadfile,".zip");
mkdir($dir);
$zip->extractTo($dir);
$zip->close();
#unlink($uploadfile);
$files = scandir($dir);
foreach ($files as $filename)
{
    print iconv('cp866', 'utf-8', $filename).PHP_EOL;
}

В результате вижу кракозябры... Пробовал просто переименовать файлы командой:

find . -type f -exec sh -c 'np=`echo {}|iconv -f cp1252 -t cp850| iconv -f cp866`; mv "{}" "$np"' \;

Опять получаются кракозябры... Однако если напрямую из оболочки через ssh запустить на сервере:

unzip -d '308313---16945050_2016_-_2(31)' '308313---16945050_2016_-_2(31).zip'

то все распаковывается нормально. Причем, если я выполняю ту же команду через PHP, с помощью system, то опять получаю кракозябры. Помогите, не могу понять в чем проблема? На всякий случай некоторая информация о системе, полученная через ssh:

$ uname -a
Linux iait-server 4.4.0-53-generic #74-Ubuntu SMP Fri Dec 2 15:58:04 UTC 2016 i686 i686 i686 GNU/Linux
$ locale
LANG=ru_RU.UTF-8
LANGUAGE=ru_RU:ru
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=ru_RU.UTF-8

Источник: https://ru.stackoverflow.com/questions/606882/phpziparchive%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%D0%AF%D0%B7%D1%8B%D0%BA-%D0%9A%D1%80%D0%B0%D0%BA%D0%BE%D0%B7%D1%8F%D0%B1%D1%80%D1%8B

Share

Тебе может это понравится...