2019-06-07T17:07:51 biancaDas kleine š mit \250 ist richtig aber wieso ist das große Š falsch? Da erwarte ich ein \246.
Wo entsteht dieser Fehler?
2019-06-07T18:47:31 hajIrgendwer interpretiert die Daten byte-weise und wandelt das NBSP in ein normales Blank um, bevor Du mit Deinem UTF8-Dekodieren zum Zug kommst.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use 5.020; use strict; use utf8; sub explain_chars { use charnames (); return join "\n", map { charnames::viacode(ord $_) } @_; } my $name = 'Gašper Šantl'; # no, that's not actually *my* name. my $regex = qr/[^0-9a-z @\.,_#+±%()\[\]\$\-~¿!'&§°¨ßäöüÅÄÁÀÃÂÖÜÚÉÈÑþœçáàåãâëéèêòóúùîïí©øØô½ñšŠý®¬µ¯]/; my (@matches) = $name =~ /$regex/g; say explain_chars(@matches);
LATIN CAPITAL LETTER G
QuoteANSI ist keine Zeichen(satz)kodierung!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
use 5.020; use Encode; sub explain_chars { use charnames (); return join "\n", map { charnames::viacode(ord $_) } @_; } my $klein = 'š'; my $gross = 'Š'; say "Vor dem Dekodieren:"; say explain_chars($klein); say explain_chars($gross); $klein = decode('Windows-1252',$klein); $gross = decode('Windows-1252',$gross); say "Nach dem Dekodieren:"; say explain_chars($klein); say explain_chars($gross);
1
2
3
4
5
6
Vor dem Dekodieren:
SINGLE CHARACTER INTRODUCER
LINE TABULATION SET
Nach dem Dekodieren:
LATIN SMALL LETTER S WITH CARON
LATIN CAPITAL LETTER S WITH CARON
print "Š", encode("UTF-8", pack("U", 160));
1 2 3 4 5 6 7 8 9
use Encode; my $name = 'Šantl'; # Scriptdatei in ANSI!!! my $vname = 'Gašper'; # Kodierung einschalten $vname = decode('ISO-8859-15', $vname); $name = decode('ISO-8859-15', $name); $, = "\n"; print $name =~ /Š/i, $vname =~ /Š/i;
1 2 3 4 5 6 7 8 9
use utf8; # Datei in UTF-8 my $name = 'Šantl'; my $vname = 'Gašper'; $, = "\n"; print $vname =~ /Š/i, # 1 $name =~ /š/i; # 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14
use Encode; # Scriptdatei in ANSI, cp1250 my $name = 'Šantl'; my $vname = 'Gašper'; # Zeichenkodierung einschalten $vname = decode('cp1250', $vname); $name = decode('cp1250', $name); my $upper = decode('cp1250', 'Š'); my $lower = decode('cp1250', 'š'); $, = "\n"; print $vname =~ /$upper/i, $name =~ /$lower/i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; local $Data::Dumper::Purity;$Data::Dumper::Purity = 1; local $Data::Dumper::Useqq;$Data::Dumper::Useqq = 1; local $Data::Dumper::Deparse = 1;$Data::Dumper::Deparse = 1; local $Data::Dumper::Sortkeys;$Data::Dumper::Sortkeys = sub { my ($hash) = @_; return [(sort {lc $a cmp lc $b} keys %$hash)]; }; use 5.010; my $name = "Zala Kralj & Ga\250per \246antl"; # no, that's not actually *my* name. my @liste; for (my $p = 0; $p < length($name); $p ++) { if (substr($name,$p,1) =~ /[^0-9a-z @\.,_#+±%()\[\]\$\-~¿!'&§°¨ßäöüÅÄÁÀÃÂÖÜÚÉÈÑþœçáàåãâëéèêòóúùîïí©øØô½ñšŠý®¬µ¯]/i) { push @liste,$p+1; } } say Dumper(\@liste);
2019-06-08T17:38:34 biancaDanke an haj und rosti aber ich weiß, dass es so funktioniert wie von euch gezeigt aber in meinem Script geht es nicht. Dort kommen die beiden Zeichen laut Data::Dumper an, wie ich gezeigt habe aber ein und der selbe Regex reagiert nur auf das kleine š richtig. Warum nicht auch auf das große Š?
2019-06-08T19:48:18 hajSchreibe den BROKEN BAR ¦ in Deine Regex.
2019-06-08T20:32:57 biancaGern geschehen.Boa ist das kompliziert! Danke dir vielmals!!!
2019-06-08T20:32:57 bianca2019-06-08T19:48:18 hajSchreibe den BROKEN BAR ¦ in Deine Regex.
Das klappt und reicht vorerst. Das ist nur rein privat für meine Musiksammlung.
https://de.wikipedia.org/wiki/Zala_Kralj_%26_Ga%C5...
2019-06-08T23:07:16 hajDass es mich bei der Methode ein bisschen gruselt, liegt vermutlich daran, dass gerade Geisterstunde ist :)
2019-06-09T05:56:21 biancaMir ist bewusst, dass man sich heutzutage lauter Krücken einfängt, wenn man nicht UTF-8 verwendet. Aber man lernt auch ein bisschen.
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
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use 5.010; use Encode; sub decode_ansi { decode('cp1252',$_[0]) } my @namen = ( decode('ISO-8859-15',"Zala Kralj & Ga\250per \246antl"), # besser vermeiden decode_ansi("Zala Kralj & Gašper Šantl"), # so sieht's doch besser aus! decode_ansi("Björk Guðmundsdóttir"), ); my $filter = decode_ansi( q/[^0-9a-z @\.,_#+±%()\[\]\$\-~¿!'&§°¨ßäöüÅÄÁÀÃÂÖÜÚÉÈÑþœçáàåãâëéèêòóúùîïí©øØô½ñšŠý®¬µ¯ð]/ ); for my $name (@namen) { my @liste; for (my $p = 0; $p < length($name); $p ++) { if (substr($name,$p,1) =~ /$filter/i) { push @liste,$p+1; } } say Dumper(\@liste); }