hotti: cgi-Datenfluß

Beitrag lesen

moin,

Hast du hotti oder die anderen Leser noch eine Idee, wie man 4000 Zeichen durch die Internetleitung knüppelt?

Wie ich schon schrieb: Mit der _Datenmenge an sich_ sehe ich kein Problem.

Dein Problem sehe ich woanders: Das _Ermitteln der Zeichenanzahl_ für UTF-8.

Also. Wenn es nur ASCII-Zeichen sind, liefert

length($str); die Anzahl der Zeichel als Anzahl der Oktetten (Bytes).

UTF-8: Du kbekommst mit CGI::param die Oktetten in Dein CGI-Script. Diese stellen UTF-8-kodierte Zeichen dar, weil Dein Formular mit dieser Kodierung ausgeliefert wird. Die Funktion length($input) würde Dir die Anzahl der Oktetten liefern. Wenn Du jedoch die Anzahl der Zeichen haben möchtest, musst Du da was tun, z.B. sowas:

  
use Encode;  
# $string = decode(ENCODING, OCTETS[, CHECK]) # s. Docu  
# Example:  
my $utf8oktetten = CGI::param('input');  
my $utf8str = decode('utf-8', $utf8oktetten);  
  
my $anzahl_bytes = length($utf8oktetten);  
my $anzahl_zeichen = length($utf8str);  
# Bemerke den Unterschied, wenn Umlaute drin sind  

Anderer Weg:

  
use CGI qw(-utf8); # This makes CGI.pm treat all parameters as UTF-8 strings.  
# Achtung: Upload (multipart/form-data) ist damit nicht mehr möglich!!!  
my $cgi = CGI->new;  
my $utf8str = $cgi->param('input');  

Und noch ein kleiner Tipp: Ein Code mit vielen globalen Variablen wird sehr schnell unübersichtlich. Fasse die alle zusammen in einer einzigen Referenz:

  
# Main Object mit allen Variablen  
my $mo = {  
	CGI => CGI->new, # CGI-Objekt als Attribut  
	name => 'otto',  
	foo => 'bar',  
};  
  
# in einer sub  
my $v = $mo->{CGI}->param('name_inputfeld');  

Jetzt könntest Du in Dein Script noch die CGI::param-Methode delegieren, notiere einfach diese Funktion in Deinem Script:

  
# DELEGATION  
sub param{  
  return $mo->{CGI}->param(@_);  
}  

Dann kannst Du die Funkion CGI::param einfach so aufrufen:

  
$mo->param();  

Und letztlich ergibt das alles einen aufgeräumten Code ;)

Schönen Sonntag,
Horst Hausr