Thread Frage zu Artikel 'Zeichenkodierungen oder „Warum funktionieren meine Umlaute nicht?”' (6 answers)
Opened by bianca at 2013-12-16 10:27

bianca
 2013-12-16 10:27
#172620 #172620
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Nachdem ich durch Best practice UTF-8 Output dem Thema Zeichencodierung ein wenig näher gekommen bin habe ich folgendes Testscript gebaut:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI 3.48;
use IO::Handle; STDOUT->autoflush(1);
use Fcntl qw(:DEFAULT);
use Encode qw(decode encode_utf8);

(my $script = $0) =~ s/^.*[\\\/]//g;
my $cgi = new CGI;
my %work = (
    chmod       => ($^O =~ /mswin/i ? 0600 : 0666),
    speicher    => 'test_utf_speicher.dat',
    endausgabe  => 'test_utf_ausgabe.dat',
);

# Verarbeitung
if (defined $cgi->param('action') && $cgi->param('action') eq 'testinput') {
    $work{testtext} = $cgi->param('testtext');

    # Zwischenspeichern
    sysopen($work{fh},$work{speicher},O_RDWR|O_CREAT,$work{chmod}) or die $!;
    binmode($work{fh}) or die $!;
    seek($work{fh},0,0) or die $!;
    print {$work{fh}} $work{testtext};
    close($work{fh});

    # wieder einlesen
    sysopen($work{fh},$work{speicher},O_RDWR|O_CREAT,$work{chmod}) or die $!;
    binmode($work{fh}) or die $!;
    seek($work{fh},0,0) or die $!;
    undef local $/;
    $work{eingelesen} = readline(scalar($work{fh}));
    close($work{fh});

    # als UTF-8 ausgeben
    $work{utf8} = encode_utf8(decode("iso-8859-15",$work{eingelesen}));
    open $work{fh},'>',$work{endausgabe} or die $!;
    print {$work{fh}} $work{utf8};
    close($work{fh});

    $work{ausgabe} = <<__HTML__
<pre>
Eingegeben wurde       : "$work{testtext}"
Wieder eingelesen wurde: "$work{eingelesen}"
</pre>
<form action="$script" method="post">
    <input type="submit" value="Nochmal neu">
</form>
__HTML__
;
}
else {
    $work{ausgabe} = <<__HTML__
<form action="$script" method="post">
    <input type="hidden" name="action" value="testinput">
    <input type="text" name="testtext" value="">
    <input type="submit" value="Start">
</form>
__HTML__
;
}

# Ausgabe
print STDOUT $cgi->new->header(-charset=>'ISO-8859-15').<<__HTML__
<!DOCTYPE HTML>
<html>
    <head>
        <title>Test UTF</title>
        <meta http-equiv="content-type" content="text/html;charset=ISO-8859-15">
    </head>

    <body>
$work{ausgabe}
    </body>
</html>
__HTML__
;

Das klappt auch auf Windows+Linux wunderbar. In dem erwähnten Artikel steht weiter unten
Quote
Beim Einlesen von POST- oder GET-Parametern mit dem Modul CGI muss man darauf achten, welche Version man benutzt: In älteren Versionen liefert die param-Methode immer Bytestrings zurück, in neueren Versionen (ab 3.29) werden die Strings dekodiert zurückgegeben, wenn vorher mit charset die Zeichenkodierung UTF-8 eingestellt wurde - andere Kodierungen werden von CGI nicht unterstützt.

Wenn ich mir mein Script so anschaue denke ich, dass ich hier ISO-8859-15 übertrage. Dem Artikel zufolge dürfte das aber nicht klappen, weil CPAN:CGI nur UTF-8 unterstützt.
Habe ich das falsch verstanden oder habe ich woanders einen Irrtum?

modedit Editiert von GwenDragon: Titel geändert, Link zu Artikel
Last edited: 2013-12-16 14:38:14 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Frage zu Artikel 'Zeichenkodierungen oder „Warum funktionieren meine Umlaute nicht?”'