my @all_encodings = Encode->encodings(":all");
1 2 3
my $enc = guess_encoding($request, qw/7bit-jis AdobeStandardEncoding AdobeSymbol AdobeZdingbat ascii ascii-ctrl big5-eten big5-hkscs cp1006 cp1026 cp1047 cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp37 cp424 cp437 cp500 cp737 cp775 cp850 cp852 cp855 cp856 cp857 cp858 cp860 cp861 cp862 cp863 cp864 cp865 cp866 cp869 cp874 cp875 cp932 cp936 cp949 cp950 dingbats euc-cn euc-jp euc-kr gb12345-raw gb2312-raw gsm0338 hp-roman8 hz iso-2022-jp iso-2022-jp-1 iso-2022-kr iso-8859-1 iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14 iso-8859-15 iso-8859-16 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 iso-8859-8 iso-8859-9 iso-ir-165 jis0201-raw jis0208-raw jis0212-raw johab koi8-f koi8-r koi8-u ksc5601-raw MacArabic MacCentralEurRoman MacChineseSimp MacChineseTrad MacCroatian MacCyrillic MacDingbats MacFarsi MacGreek MacHebrew MacIcelandic MacJapanese MacKorean MacRoman MacRomanian MacRumanian MacSami MacSymbol MacThai MacTurkish MacUkrainian MIME-B MIME-Header MIME-Header-ISO_2022_JP MIME-Q nextstep null posix-bc shiftjis symbol UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE UTF-32BE UTF-32LE UTF-7 utf-8-strict utf8 viscii/); ref($enc) or die "Can't guess: $enc"; my $string = $enc->decode($request);
1 2
my $encoding_name = Encode::Detect::Detector::detect($request); return $encoding_name;
1 2 3 4 5
use Devel::Peek; my $mp3 = MP3::Tag->new( $file ); my ($title, $track, $artist, $album, $comment, $year, $genre) = $mp3->autoinfo(); my $string = "$entry|$title|$track|$artist|$album|$comment|$year|$genre"; Dump ($string);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ perl -wE'
use Devel::Peek;
use MP3::Tag;
my $mp3 = MP3::Tag->new("Aerzte__Zu_Spaet.mp3");
my $artist = $mp3->artist;
Dump $artist;'
SV = PVMG(0x871b180) at 0x8479aa8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK,UTF8)
IV = 0
NV = 0
PV = 0x865a6e0 "Die \303\204rzte"\0 [UTF8 "Die \x{c4}rzte"]
CUR = 10
LEN = 12
2011-07-27T10:17:28 pqalso vielleicht postest du einfach mal ein konkretes beispiel. dein beispiel von oben sollte ja einer der fälle sein, die kein problem machen, oder? denn dort hast du mit Die \x{c4}rzte ja schon utf8.
2011-07-27T12:09:29 GwenDragon
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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
#!/usr/bin/perl -wT use Benchmark; my $t0 = Benchmark->new; use strict; use warnings; use diagnostics; use CGI::Carp qw(fatalsToBrowser); open STDERR, '>>', "/var/www/STDERR.txt" || die "Can't redirect STDERR: $!"; use utf8; use Encode; use Encode::Detect::Detector; use FileHandle; use MP3::Tag; my $search_dir = "/media/MediaLibrary/Audio"; my $database = "/var/www/testDB.dat"; # Codepages die beim Konvertieren zu lupenreinem utf8 Ärger machen my @TroubleMakers = ('EUC-', 'UTF-8', 'cyrillic'); print "Content-type: text/html; charset=utf-8\n\n"; print "<h1>Welcome to my little test script.</h1>\n"; my $counter = 0; unlink($database) || print "<b>Database did not exists.</b><br/>\n"; my $fh = FileHandle->new('>>' . $database) || die "Could not open $database - $_"; my @mp3s = &CreateDB( $search_dir ); $fh->close || die "Could not close $database - $_"; print "<b>total number of mp3s: $counter</b><br/>\n"; my $t1 = Benchmark->new; my $td = timediff($t1, $t0); my $benchmarktime = timestr($td); print "<br/>\n<br/>\n".$benchmarktime; sub CreateDB { my @dirs = @_; my (@allfiles, @files) = (); my ($currdir, $filename) = ""; while (@dirs != 0) { $currdir = pop( @dirs ); opendir( ENTRIES, "$currdir/" ); @allfiles = readdir(ENTRIES); closedir(ENTRIES); for $filename (@allfiles) { if (-d "$currdir/$filename") { push( @dirs, "$currdir/$filename" ) if (($filename ne ".") && ($filename ne "..")); } else { my $file = "$currdir/$filename"; my (undef,undef,$SourceExt) = &SeperatePathFileExt($file); if (($SourceExt eq "mp3") && ($file !~ /\.AppleDouble/)) { my %MetaData = (); my $mp3 = MP3::Tag->new( $file ); ($MetaData{title}, $MetaData{track}, $MetaData{artist}, $MetaData{album}, $MetaData{comment}, $MetaData{year}, $MetaData{genre}) = $mp3->autoinfo(); for my $key (keys %MetaData) { $MetaData{$key} = &CheckAndConvertUTF8($MetaData{$key}); } my $string = "$file|$MetaData{title}|$MetaData{track}|$MetaData{artist}|$MetaData{album}|$MetaData{comment}|$MetaData{year}|$MetaData{genre}"; print "$string<br/>\n"; print $fh "$string\n" || return "bad error: $_"; $counter++; } } } } return 1; } sub SeperatePathFileExt { my ($string) = @_; my ($path, $filename, $ext) = ""; if ($string =~ m!^(.*)/([^/]*)$!) { $path = $1; $filename = $2; } else { $path = ""; $filename = $string; } ($ext) = $filename =~ /\.([^.]+?)$/; $ext = lc($ext); $filename =~ s-(.*).$ext$-$1-ig; return ($path, $filename, $ext); } sub CheckAndConvertUTF8 { my ($request) = @_; my $encoding_name = Encode::Detect::Detector::detect($request); unless (defined $encoding_name) {$encoding_name = "undefined";} if ($encoding_name eq "") {$encoding_name = "undefined";} if ((defined $_) && (grep( m/$encoding_name/, @TroubleMakers ))) { if ($encoding_name ne "undefined") { $request = Encode::encode("utf8", Encode::decode($encoding_name, $request)); } if ($encoding_name eq "undefined") { utf8::encode($request); } } # decode und danach gleich ein encode sieht nach Fehler aus, # ist aber keiner ohne geht bei vielen strings schlichtweg nicht. utf8::decode($request); utf8::encode($request); $request =~ s/\015\012|\012|\015/ /sg; # alle Umbrüche gegen Leerzeichen ersetzen $request =~ s-\|-\&\#124\;-g; # pipe ersetzen für csv $request =~ s/ / /sg; # doppelte Leerezeichen gegen einfache Leerzeichen ersetzen return $request; } # EOF
QuoteThe "use utf8" pragma tells the Perl parser to allow UTF-8 in the
program text
[...]
Do not use this pragma for anything else than telling Perl that your
script is written in UTF-8.
Quote:-)Um Kritik wird gebeten.
Quoteich hatte dir in msg #150806 an einem vollständigen beispiel gezeigt, dass MP3::Tag in besagtem Fall einfach utf-8 liefert. darauf bist du leider gar nicht eingegangen und ich frage mich wieso. jedenfalls verstehe ich den ganzen aufwand mit decode und encode nicht.
Quotedesweiteren hast du behauptet, dass \xc4 nur in kombination mit anderen codes existiert, dabei ist es ein simples Ä in utf-8. das lässt den verdacht aufkommen, dass es dir an verständnis der ganzen sache fehlt. und offensichtlich an lust, sich mit den anmerkungen anderer zu beschäftigen.
QuoteIch finde zu aller erst mal nicht heraus, um welchen Zeichensatz es sich handelt. Also brauche ich also auch nicht wild von unbekannt nach utf-8 konvertieren. - Hab's aber natürlich trotzdem probiert.