Итог таков:

В последней версии IO::Compress::Zip есть код для запаковки в utf-8, но он весь 
закомментарен
https://metacpan.org/source/PMQS/IO-Compress-2.062/lib/IO/Compress/Zip.pm#L325

есть еще extrafield 0x0008, кто на него смотрит не знаю.

т.е. мы воспользовались патченной версией IO::Compress::Zip.

1. раскомментили и поправили под флаг utf8
2. добавляем ExtraFieldLocal => pack('s',8), "65001"
3. добавляем 
     my $pathextra = pack 'C v a*', 1, 
Compress::Raw::Zlib::crc32($opts->{Name}), $opts->{Name};
     ExtraFieldLocal => pack('s',0x7075), pack('sa*',length 
($pathextra),$pathextra )

Возможно кому-то еще пригодится.

PS:
По дефолту в зипе однобайтные кодировки, и сама винда никогда и ни при каком 
условии не сможет распаковать utf-8 архив.
она всегда пытается трактовать имена как однобайтные, в той локали, которая у 
нее дефолтная.
Теоретически, под кириллическую винду нужно было-бы паковать как cp866
Но если винда не кириллическая, то получить архив с кириллическими именами в 
ней невозможно средствами самой винды.

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить