Монс, это ко мне вопрос? к Максиму, наверное
02.10.2013, 15:49, "Mons Anderson" <[email protected]>: > А можно, плиз > > 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 -- Oleg Alistratov -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
