Наткнулись на проблему, при распаковке zip архива (php7), если в именах русские символы получаем каракули (в нашем случае только они и присутствуют), странным способом перекодированные.
Создаем архив используя ДОСовскую кодировку 866 с ней нет проблем со встроенными в винду зип-архиватором, если использовать 1251 в винде до 8-ки опять же каракули.
$zip->addFile($pathFrom . '/' . $doc->hashedName, mb_convert_encoding($doc->originalName, 'CP866', 'UTF-8'));
Пытаемся распаковать из ПХП
$Zip = new ZipArchive();
$open = $Zip->open('in_01122016000000.zip');
$length = $Zip->numFiles;
for($i = 0; $i < $length; $i++)
{
echo $Zip->getNameIndex($i) . ' ' . mb_convert_encoding($Zip->getNameIndex($i), 'UTF-8', 'UTF-8, CP866') . '
';
}
Заглянув в исходники zip расширения, находим, что начиная с php 5.6 при получении имени файла вызывается _zip_string_get, где используется логика угадывания кодировки (/* start guessing */) и для получения не измененной строку нужно указать флаг ZIP_FL_ENC_RAW. Пока в официальной документации о такой возможности умалчивают, речь только о флаге ZipArchive::FL_UNCHANGED — до изменений.
//zip.h
//#define ZIP_FL_ENC_RAW 64u /* get unmodified string */
echo mb_convert_encoding($Zip->getNameIndex($i, 64), 'UTF-8', 'UTF-8, CP866') . '
';
или так
$stat = $Zip->statIndex($i, 64);
echo mb_convert_encoding($stat['name'], 'UTF-8', 'UTF-8, CP866') . '
';
ZipArchive reads filenames with UTF-8 characters wrong