Thread readdir und utf-8 auf Linux Kiste (11 answers)
Opened by cbxk1xg at 2011-07-22 18:43

cbxk1xg
 2011-07-22 18:43
#150673 #150673
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
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
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
2
3
4
5
6
7
8
9
/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)
Code: (dl )
1
2
3
4
5
6
/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)

View full thread readdir und utf-8 auf Linux Kiste