А можно, плиз unzip -v perl -MIO::Compress::Zip -E 'say $IO::Compress::Zip::VERSION;' locale
ну и версии 7z или 7za On 02.10.2013, at 15:30, Oleg Alistratov <[email protected]> wrote: > Это не проблема IO::Compress::Zlib (и не проблема Archive::Zip). > В твоем случае это проблема с 7zip. Например, у меня твой скрипт генерирует > архив, > который отлично показывается unzip-ом со всеми буквами в имени файла: > > [15:26:18] local:~/enigmas/zip-rus% unzip -l result.zip > Archive: result.zip > Length Date Time Name > -------- ---- ---- ---- > 8 10-02-13 15:25 русское имя.txt > -------- ------- > 8 1 file > > Явление это проистекает из того, что формат zip достаточно старый, при его > создании никто не заботился > указанием кодировок в именах members. Поэтому разархиваторы додумывают уже > кто на что горазд. > Скорее всего, 7zip предполагает найти имена в кодировке cp866, попробй > конвертнуть в нее. > > > 02.10.2013, 13:55, "Максим" <[email protected]>: >> Доброго дня. >> >> Буду рад если кто-то поможет разобораться в задаче создания zip-архива с >> русскими именами файлов в нём. Архив создаётся и читается под linux. >> Версия IO::Compress::Zlib свежая. Все что нашел в гугле уже попробовал, >> ничего не помогает. >> >> Есть пример скрипта (набрано в utf-8), который создает тестовый архив с >> одним файлом. Если сделать его имя русским, при распаковке 7z выдаёт >> вместо имени файла крокозябры. >> >> cat pack.pl | sed '2,$s/^ *#.*//' >> #!/usr/bin/perl >> >> use strict; >> use warnings; >> >> use Encode; >> >> use IO::Compress::Zip qw(zip $ZipError) ; >> >> my $filename = 'русское имя.txt'; >> >> my $z = new IO::Compress::Zip 'result.zip', { name=> $filename, >> CanonicalName => 1} >> or die "zip failed: $ZipError\n"; >> >> $z->print("Content\n"); >> >> $z->close; >> >> Крокозябры похожи на те что вылезают при конкатенации символьных utf-строк >> с байтовыми строками. Если добавить принудительный decode, проблема не >> уходит. >> cat pack.pl | sed '2,$s/^ *#.*//' >> #!/usr/bin/perl >> >> use strict; >> use warnings; >> >> use Encode; >> >> use IO::Compress::Zip qw(zip $ZipError) ; >> >> my $filename = 'русское имя.txt'; >> $filename = decode('utf8', $filename ); >> >> my $z = new IO::Compress::Zip 'result.zip', { name=> $filename, >> CanonicalName => 1} >> or die "zip failed: $ZipError\n"; >> >> $z->print("Content\n"); >> >> $z->close; >> >> Вывод листинга файлов 7z в обоих случаях такой >> 7z l result.zip >> >> 7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 >> p7zip Version 9.20 (locale=en_US.utf8,Utf16=on,HugeFiles=on,4 CPUs) >> >> Listing archive: result.zip >> >> -- >> Path = result.zip >> Type = zip >> Physical Size = 174 >> >> Date Time Attr Size Compressed Name >> ------------------- ----- ------------ ------------ ------------------------ >> 2013-10-02 14:48:14 ..... 8 10 ÑÑÑÑкое >> имÑ.txt >> ------------------- ----- ------------ ------------ ------------------------ >> 8 10 1 files, 0 folders >> >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org > > -- > Oleg Alistratov > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
