[Moscow.pm] Создание zip-архива с русскими именами файлов через IO::Compress::Zip
Mons Anderson
mons на cpan.org
Ср Окт 2 05:49:04 PDT 2013
А можно, плиз
unzip -v
perl -MIO::Compress::Zip -E 'say $IO::Compress::Zip::VERSION;'
locale
ну и версии 7z или 7za
On 02.10.2013, at 15:30, Oleg Alistratov <ali на ali.org.ua> 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, "Максим" <monk на nuked.su>:
>> Доброго дня.
>>
>> Буду рад если кто-то поможет разобораться в задаче создания 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
>> moscow-pm на pm.org | http://moscow.pm.org
>
> --
> Oleg Alistratov
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
Подробная информация о списке рассылки Moscow-pm