<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Итог таков:<div><br></div><div>В последней версии IO::Compress::Zip есть код для запаковки в utf-8, но он весь закомментарен</div><div><a href="https://metacpan.org/source/PMQS/IO-Compress-2.062/lib/IO/Compress/Zip.pm#L325">https://metacpan.org/source/PMQS/IO-Compress-2.062/lib/IO/Compress/Zip.pm#L325</a></div><div><br></div><div>есть еще extrafield 0x0008, кто на него смотрит не знаю.</div><div><br></div><div>т.е. мы воспользовались патченной версией IO::Compress::Zip.</div><div><br></div><div>1. раскомментили и поправили под флаг utf8</div><div>2. добавляем ExtraFieldLocal => pack('s',8), "65001"</div><div>3. добавляем </div><div><div>     my $pathextra = pack 'C v a*', 1, Compress::Raw::Zlib::crc32($opts->{Name}), $opts->{Name};</div></div><div>     ExtraFieldLocal => pack('s',0x7075), pack('sa*',length ($pathextra),$pathextra )</div><div><br></div><div>Возможно кому-то еще пригодится.</div><div><br></div><div>PS:</div><div>По дефолту в зипе однобайтные кодировки, и сама винда никогда и ни при каком условии не сможет распаковать utf-8 архив.</div><div>она всегда пытается трактовать имена как однобайтные, в той локали, которая у нее дефолтная.</div><div>Теоретически, под кириллическую винду нужно было-бы паковать как cp866</div><div>Но если винда не кириллическая, то получить архив с кириллическими именами в ней невозможно средствами самой винды.</div><div><br></div></body></html>