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__ ;
QuoteBeim 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.
2013-12-16T09:27:02 biancaWenn 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 CGI nur UTF-8 unterstützt.
Habe ich das falsch verstanden oder habe ich woanders einen Irrtum?
2013-12-16T10:33:13 moritzDie Frage ist doch, was du mit "unterstuetzt" meinst.
2013-12-16T10:33:13 moritzalles andere wird einfach als Bytestrings weiter gegeben.
QuoteIn älteren Versionen liefert die param-Methode immer Bytestrings zurück
2013-12-16T10:33:13 moritzUnd du behandelst sie als Bytestrings (gibst sie z.B. print auf einem filehandle on encoding-Layer), also ist doch alles, wie ich es geschrieben habe.
Quotehttps://metacpan.org/pod/CGI#PRAGMASIt is better to manually select which fields are expected to return utf-8 strings and convert them using code like this: