Hallo!
Ich habe ein sehr seltsames Problem mit dem Zeichensatz und readdir. Ich habe mal vor Jahren meine MP3-Sammlung von Windows via Netzlaufwerk (smb) auf einen FreeBSD Server (freenas) kopiert. Soweit mir bekannt ist, unterscheiden sich hier schon mal die Zeichensätze. Ich glaube "Latin 1" zu utf-8.
Ich wollte nun mit einem Skript die Pfade der MP3s in einer Index-Datei speichern und später noch was damit anstellen. Aber alles zu seiner Zeit...
Ich kann nun erfolgreich von Mac/Win/Linux/etc. per smb mount mit Windows Explorer/Finder/Nautilus/etc. darauf zugreifen und alle Zeichen werden richtig dargestellt. Nicht aber in der Shell. Da wird ein ä zu ?. Und unter Perl ist es nun prinzipiell genauso.
So und nu geht's los. Je nach System sieht der Odner "Die Ärzte" folgendermaßen aus:
- FreeBSD host (hier liegen die Daten): Die ??rzte
- WebServer in der shell via "ls" (smb mount des FreeBSD): Die ?rzte
- WebServer unter Perl : "Die �rzte"
Hier das Skript
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
use Benchmark;
my $t0 = Benchmark->new;
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use utf8;
use open qw/:std :utf8/;
use encoding 'utf8';
use FileHandle;
my $search_dir = "/media/MediaLibrary/Audio";
my $database = "/var/www/testDB.dat";
print "Content-type: text/html; charset=utf-8\n\n";
my @mp3s = &GetTheFiles( $search_dir );
my $t1 = Benchmark->new;
my $td = timediff($t1, $t0);
my $benchmarktime = timestr($td);
print "<br/>\n<br/>\n".$benchmarktime;
sub GetTheFiles {
my @dirs = @_;
my (@allfiles, @files) = ();
my ($currdir, $file) = "";
while (@dirs != 0) {
$currdir = pop( @dirs );
opendir( ENTRIES, "$currdir/" );
@allfiles = readdir( ENTRIES );
closedir( ENTRIES );
for $file (@allfiles) {
if (-d "$currdir/$file") {
push( @dirs, "$currdir/$file" ) if (($file ne ".") && ($file ne ".."));
}
else {
my $entry = "$currdir/$file";
utf8::encode($entry);
print $entry."<br/>\n";
my $fh = FileHandle->new('>>' . $database) || die "Could not open $database - $_";
print $fh "$entry\n";
$fh->close || die "Could not close $database - $_";
}
}
}
return 0;
}
Der HTML-Ouput (natürlich gekürzt)
/media/MediaLibrary/Audio/Bj�rk<br/>
/media/MediaLibrary/Audio/Die �rzte<br/>
/media/MediaLibrary/Audio/D�sert Blues<br/>
/media/MediaLibrary/Audio/Herbert Gr�nemeyer<br/>
/media/MediaLibrary/Audio/H�rspiele<br/>
/media/MediaLibrary/Audio/Schr�ders<br/>
<br/>
<br/>
7 wallclock secs ( 0.70 usr + 0.90 sys = 1.60 CPU)
Der Inhalt der testDB.dat (natürlich gekürzt)
/media/MediaLibrary/Audio/Bj�rk
/media/MediaLibrary/Audio/Die �rzte
/media/MediaLibrary/Audio/D�sert Blues
/media/MediaLibrary/Audio/Herbert Gr�nemeyer
/media/MediaLibrary/Audio/H�rspiele
/media/MediaLibrary/Audio/Schr�ders
Last edited: 2011-07-23 13:22:03 +0200 (CEST)