7z --help
И есть такой свитч:
-scs{UTF-8 | WIN | DOS}: set charset for list files
Оно?
И да, архив создаётся корреткно, по крайней мере unzip нормально распаковывает.
2013/10/2 Oleg Alistratov <[email protected]>:
> Это не проблема 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
--
//wbr, Dmitry L.
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org