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

Максим monk на nuked.su
Ср Окт 2 03:55:06 PDT 2013


Доброго дня.

Буду рад если кто-то поможет разобораться в задаче создания 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