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