CGI.pm und binmode?
Meise2000
- perl
Hallo,
ich lese für ein Perl-Script die Parameter mit dem CGI-Modul aus.
Gibt es die Möglichkeit dem CGI-Objekt beizubringen, dass er im binmode von STDIN lesen soll?! Ich möchte nämlich mit unicode arbeiten, so wie es in
http://forum.de.selfhtml.org/archiv/2006/7/t133539/#m866028
beschrieben steht.
Danke,
Meise.
hallo,
Gibt es die Möglichkeit dem CGI-Objekt beizubringen, dass er im binmode von STDIN lesen soll?
Meines Wissens tut das Modul von Haus aus gar nichts anderes - oder ich verstehe deine Frage nicht.
Ich möchte nämlich mit unicode arbeiten, so wie es in
http://forum.de.selfhtml.org/archiv/2006/7/t133539/#m866028
beschrieben steht.
Der Thread ist/war interessant, ja. Du könntest nun noch aus der Forums-Hilfe lernen, wie du Verweise formatieren solltest.
Eventuell nutzt es, wenn du deine Frage, am besten anhand eines (kurzen) Scriptbeispiels, etwas genauer erläuterst. Vor allem kann im Moment niemand deiner Fragestellung _genau_ entnehmen, wo du eventuell Fehler/Probleme gefunden hast.
Grüße aus Berlin
Christoph S.
Hey,
binmode, bevor zu das Objekt erzeugst, funktioniert.
binmode STDIN => ':utf8';
my $q = CGI->new;
Hallo,
binmode STDIN => ':utf8';
my $q = CGI->new;
habe ich probiert, aber es führt leider nicht zum gewünschten Erfolg.
Mein Ziel ist es, alle Zeichen als UTF-8 entgegen zu nehmen und - falls es sich um kein ASCII-Zeichen handelt, als &#[ZAHLWERT\_DES\_ZEICHENS]; wieder an den Browser zu schicken.
Zunächst habe ich das so gemacht:
~~~perl
my $q = CGI->new;
my $param = $q->param("param");
# jetzt uncodieren
$param = Encode::decode_utf8($param)
my ( @res, $c );
foreach $c ( unpack( "U*", $string ) ) {
if ( $c > 127 || $c < 32 ) {
push( @res, '&#' . $c . ';' );
} else {
push( @res, chr($c) );
}
}
my $encParam = ( join( '', @res ) );
Das hat auch wunderbar funktioniert, aber leider ist bei meinem Provider "Encode" nicht installiert. Brauche eine Alternative und bin für jede Hilfe dankbar. Der Ansatz:
binmode STDIN => ':utf8';
my $q = CGI->new;
my $param = $q->param("param");
# jetzt uncodieren
my ( @res, $c );
foreach $c ( unpack( "U*", $string ) ) {
if ( $c > 127 || $c < 32 ) {
push( @res, '&#' . $c . ';' );
} else {
push( @res, chr($c) );
}
}
my $encParam = ( join( '', @res ) );
schlägt fehl.
Danke,
Meise.
NACHTRAG:
das $string ist natürlich ein $param
Sorry, im Code ist das Kodieren in ne externe Subroutine verlagert...
habe ich probiert, aber es führt leider nicht zum gewünschten Erfolg.
Mein Ziel ist es, alle Zeichen als UTF-8 entgegen zu nehmen und - falls es sich um kein ASCII-Zeichen handelt, als &#[ZAHLWERT_DES_ZEICHENS]; wieder an den Browser zu schicken.
werden UTF-8 Zeichen vom Browser als solche übertragen?
werden die nicht umgewandelt?
Struppi.
Hey,
habe ich probiert, aber es führt leider nicht zum gewünschten Erfolg.
bei mir funktionierts.
Mein Ziel ist es, [...] falls es sich um kein ASCII-Zeichen handelt, als &#[ZAHLWERT_DES_ZEICHENS]; wieder an den Browser zu schicken.
Dafür nimmt man HTML::Entities. http://search.cpan.org/dist/HTML-Parser/lib/HTML/Entities.pm
aber leider ist bei meinem Provider "Encode" nicht installiert.
Du tust mir herzlich Leid. Encode ist Standardmodul in der Perldistro seit Version 5.7.1. http://perldoc.perl.org/perl571delta.html#New-Modules Diese erschien am 9. April 2001! Dein Provider ist unter aller Sau.
Als Rückfalloption zu Encode gibt es einige UTF8-bezogene Funktionen, die das Pragmamodul utf8 bereitstellt. Natürlich hilft dir das nicht, weil sie in der uralten Version, die du hast, auch fehlen.
Du kannst versuchen, fehlende Module in deinem Homeverzeichnis nachzuinstallieren. http://cpan.org/misc/cpan-faq.html#How_install_private
Was deine Aussage zum Provider betrifft, so kann ich dir voll zustimmen - Zeit sich mal was anderes zu suchen.
Ich habe aber einen Workaround gefunden. Ein Blick ins CGI.pm zeigt, dass von STDIN nur dann im binmode ausgelesen wird, wenn das OS nicht UNIX ist. Letzteres läuft bei meinem Provider.
Hier lokal arbeite ich unter Windows (schande über mich). Unter UNIX scheint
my $q = CGI->new();
my $s = unpack("U*", $q->param("par"));
:
schon zu reichen, während unter Windows (und ich denke mal unter allen anderen Betriebssystemen bei denen CGI.pm nicht auf binmode einliest) noch ein Encode gemacht werden muss... so ganz habe ich das immer noch nicht verstanden.
Trotzdem erst mal vielen Dank!
Meise.