Thread Zeichensatzproblem mit Š (15 answers)
Opened by bianca at 2019-06-07 19:07

haj
 2019-06-08 00:42
#190105 #190105
User since
2015-01-07
527 Artikel
BenutzerIn

user image
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
ANSI ist keine Zeichen(satz)kodierung!

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
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


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)

View full thread Zeichensatzproblem mit Š