Thread Archive::Zip Umlaute auf Windows (14 answers)
Opened by bianca at 2016-05-01 10:57

bianca
 2016-05-01 10:57
#184650 #184650
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Guten Morgen!

Nun muss ich doch nochmal um Hilfe zum CPAN:Archive::Zip bitten. Und zwar bekomme ich es trotz Verwendung von $Archive::Zip::UNICODE = 1 nicht hin, dass die Umlaute im ZIP korrekt sind.

Hier ein Script zum testen.
Bitte im selben Verzeichnis einen Ordner test_archive_broschüre und darin eine Datei mit Umlaut im Namen anlegen.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

###########################################################
# Def
my @pfade = ("test_archive_broschüre");    # Quelle(n)
my $ziel_zip = 'test.zip';              # Zieldatei

###########################################################
# Pre
say("\n\n\n".('-' x 80)."\ngeht los");

require Encode;

require Archive::Zip;
$Archive::Zip::UNICODE = 0;     # Name "Archive::Zip::UNICODE" used only once...
if ($^O =~ /mswin/i) {
    $Archive::Zip::UNICODE = 1;
}
Archive::Zip->setErrorHandler(
    sub {
        $_[0] =~ s/[ \r\n]$//g;
        say("FEHLER '$_[0]' mit caller '".join('*',caller)."'");
        goto(ENDE);
    }
);
say("Archive::Zip Version: ".(Archive::Zip->VERSION));

###########################################################
{   # write ZIP
    my $zip = Archive::Zip->new();
    while (scalar(@pfade)) {
        my $pfad = shift(@pfade);
        if (opendir(my $fh,$pfad)) {
            foreach my $file (sort {$a cmp $b} readdir($fh)) {
                next() if $file eq '.' || $file eq '..';
                my $win_konsole;
                {   # Gegenprobe
                    my $roh = Encode::decode('iso-8859-1',$file);
                    say "Roh: '$roh'";
                    $win_konsole = Encode::encode('cp850',$roh);
                    say "Win: '$win_konsole'";
                }
                if (-d "$pfad/$file") {
                    push(@pfade,"$pfad/$file");
                }
                else {
                    say("add '$pfad/$file'");
                    my $file_member = $zip->addFile({
                        filename            => "$pfad/$file",
                        compressionLevel    => Archive::Zip::COMPRESSION_LEVEL_FASTEST(),
                    });
                }
            }
        }
    }
    if (!-f $ziel_zip || unlink($ziel_zip)) {
        unless($zip->writeToFileNamed($ziel_zip) == Archive::Zip::AZ_OK()) {
            die("Fehler in ".__LINE__);
        }
    }
    else { die("Fehler in ".__LINE__); }
}

###########################################################
{ # read ZIP
    my $zip = Archive::Zip->new();
    if ($zip->read($ziel_zip) == Archive::Zip::AZ_OK()) {
        if (exists $zip->{members} && scalar(@{$zip->{members}})) {
            foreach my $ref (@{$zip->{members}}) {
                my $fn = $ref->{fileName};
                say("Dateiname im ZIP: ====> '$fn' <====");
            }
        }
        else { die("Fehler in ".__LINE__); }
    }
    else { die("Fehler in ".__LINE__); }
}

###########################################################
# End
ENDE:
say("Fertig\n".('-' x 80));

Kommt bei mir mit Strawberry 5.18.4 64 Bit auf Win7 64 Bit raus wie es auch im Screenshot zu sehen ist.
Quote
--------------------------------------------------------------------------------
geht los
Archive::Zip Version: 1.57
Roh: 'brosch³re.txt'
Win: 'broschüre.txt'
add 'test_archive_brosch³re/brosch³re.txt'
Wide character in say at test_archive.pl line 74.
Dateiname im ZIP: ====> 'test_archive_brosch´┐¢re/brosch´┐¢re.txt' <====
Fertig
--------------------------------------------------------------------------------

Was kann man machen, um dem abzuhelfen?

An Nicht-Windows Nutzer hätte ich die Frage, ob es denn auf Linux/Mac mit Umlauten funktioniert. Damit wir eine sinnvolle Gegenprobe haben.
Anhänge
image/png
684 x 129
archive_zip_10.png
archive_zip_10.png
10 print "Hallo"
20 goto 10

View full thread Archive::Zip Umlaute auf Windows