hotti: Hilfe bei TCP Server/Client

Beitrag lesen

hi Jörg, danke fürs Mitmachen,

Alternative: Du könntest das z.b mittels read realisieren:

Damit kannst Du eine frei definierbare Anzahl von Zeichen lesen - wie viele hängt davon ab,

Hier sei mir mal eine klitzkleine Anmerkung erlaubt: read() liest eine Anzahl von _Bytes (nicht Zeichen) aus einem Handle. Ein Byte ist nicht immer gleich ein Zeichen und in der Welt der Binaries gibt es nur noch Bytes, auch wenn diese Bytes Zeichen darstellen könnten.

Seit Perl Unicode unterstützt, wird Perlintern zwischen Bytes und Zeichen unterschieden. Ggf. kann mit dem Pragma use bytes; die Byte Semantic hergestellt werden, das ist für IO Sachen wichtig, denn in einem Handler (Sockets, STDIN, STDOUT, FileHandler) werden _stets_ Bytes erwartet.

Wenn wir beispielsweise eine utf-8-kodierte Zeichenkette haben, die Perlintern also solche gekennzeichnet ist (Scalar-Value UTF8: SvUTF8) und schicken die mit print auf ein Handle, z.B. STDOUT (Webserver) gibt es eine Fehlermeldung (wide character...) und die Darstellung ist verstümmelt.

Mit use bytes; vor der print-Anweisung ist die Darstellung ok, eine andere Möglichkeit besteht darin, dem IOLayer die Kodierung mitzuteilen:

  
binmode STDOUT, ":utf8";  

und mit Perl v5.10 kommt use utf8::all; was das Alles wie von selbst erledigt.

Desweiteren liefert length() entweder die Anzahl der Zeichen oder die Anzahl der Bytes, je nachdem, ob Character- oder Byte Semantics eingestellt ist. Weitere String-Funktionen wie uc(), lc(), substr() funktionieren nur mit Zeichenketten. Bereits mit v5.8. kam das Perlmodul Encode.pm, in dessen POD steht ne ganze Menge zur Problematik...

Also darauf wollte ich nurmalso nebenbei hinweisen ;)

Hotti