Thread Zeichensatzproblem mit Š
(15 answers)
Opened by bianca at 2019-06-07 19:07
Da brauche ich schon etwas mehr Kontext, um weiterhelfen zu können. So kann ich nur sagen "bei mir funktioniert's!".
Ich habe folgendes Programm verwendet: Code (perl): (dl
)
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); Die Ausgabe lautet erwartungsgemäß: Code: (dl
)
LATIN CAPITAL LETTER G ...denn außer dem großen G zu Beginn schließt die Regex alle Characters des Namens aus. Nachtrag: Mir ist gerade noch das Reizwort ANSI-Script aufgefallen. GwenDragon hat es schon mal gesagt: Quote Ich vermute, es handelt sich um Windows-1252, aber das ist gar nicht sooo wichtig. Entscheidend ist, dass das nicht der Standard-Zeichensatz von Perl ist. Perl verwendet ISO-Latin-1, und der Zeichensatz kennt weder š noch Š. Ich habe in meinem Beispiel eine UTF-8-Datei verwendet und das mit use utf8; deklariert, damit Perl die Literale 'š' und 'Š' so versteht, wie sie gemeint sind. Es gibt aber kein use ANSI; oder use Windows-1252; Wenn Du Dateien in einer Codierung ungleich ISO-Latin-1 speicherst und darin Literale verwendest, die außerhalb des gemeinsamen Zeichenvorrats liegen, dann musst Du diese Literale selbst decodieren, damit Perl sie "richtig" versteht. Auch wenn sie als Patterns in einem regulären Ausdruck verwendet werden sollen! Folgende Datei habe ich unter Windows CP 1252 abgespeichert: 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 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); Das ergibt beim Ablauf: Code: (dl
)
1 Vor dem Dekodieren: Man sieht: Vor dem Dekodieren versteht Perl das, was Du als š eintippst, als SINGLE CHARACTER INTRODUCER, was auch immer das sein mag. Erst nach dem Dekodieren versteht Perl, was Du meinst. Last edited: 2019-06-08 12:00:56 +0200 (CEST) |