[Moscow.pm] Создание zip-архива с русскими именами файлов через IO::Compress::Zip

Mons Anderson mons на cpan.org
Ср Окт 2 17:06:30 PDT 2013


Итог таков:

В последней версии 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
Но если винда не кириллическая, то получить архив с кириллическими именами в ней невозможно средствами самой винды.

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20131003/9595953e/attachment.html>


Подробная информация о списке рассылки Moscow-pm