Итог таков:
В последней версии 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