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

Maxim monk на nuked.su
Ср Окт 2 11:29:06 PDT 2013


Можно сказать задача решилась, спасибо участникам обсуждения за помощь.

On Wed, 2013-10-02 at 15:35 +0400, Dmitry L. wrote:
> 7z --help
> 
> И есть такой свитч:
> -scs{UTF-8 | WIN | DOS}: set charset for list files
> 
> Оно?
> 
Я этот ключ видел в --help, но в командлайне он отказался работать.


> И да, архив создаётся корреткно, по крайней мере unzip нормально распаковывает.
> 

Да, я недоглядел, из-за этого потерял много времени. unzip -v показывает
кривые имена, но достаёт файлы нормально.


> 2013/10/2 Oleg Alistratov <ali на ali.org.ua>:
> > Это не проблема 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, попробй конвертнуть в нее.
> >

Как выяснилось, в zip формате возможно хранение имен файлов в utf-8. Для
этого выставляется 11-й бит в поле general purpose bit flag. Однако
интерфейс для этого в IO::Compress::Zip не предусмотрен.

Также здесь http://www.pkware.com/documents/casestudies/APPNOTE.TXT
буквально только что наткнулся на описание расширений, позволяющих
хранить коментарии к архиву тоже в UTF

> >
> > 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
> 
> 
> 
> -- 
> //wbr, Dmitry L.



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