Thread readdir und utf-8 auf Linux Kiste
(11 answers)
Opened by cbxk1xg at 2011-07-22 18:43
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:
Hier das Skript 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 #!/usr/bin/perl -T 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; } # EOF Der HTML-Ouput (natürlich gekürzt) Code: (dl
)
1 /media/MediaLibrary/Audio/Bj�rk<br/> Der Inhalt der testDB.dat (natürlich gekürzt) Code: (dl
)
1 /media/MediaLibrary/Audio/Bj�rk Last edited: 2011-07-23 13:22:03 +0200 (CEST) |