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
use strict; use warnings; use 5.020; use utf8; my $maxlen = 300; # $data wird aus einer Datei gefüllt, ich habe den Code entfernt # kürzen $data = shorten($data); sub shorten { my $source = shift; # Puffer für geänderte Elemente my @replaced_data = (); # HTML-Parser erzeugen my $p = HTML::Parser->new(); $p->empty_element_tags(1); $p->xml_pic(1); # damit auch z.B. <?php .... ?> geparst wird $p->utf8_mode(1); # Handlerroutine für bestimmte Startelemente registrieren $p->handler( start => sub { return "" } ); # Handlerroutine für bestimmte Endelemente registrieren $p->handler( end => sub { return "" } ); # Handlerroutine für Textinhalt + Deskodierung registrieren $p->handler( text => sub { my $s = shift; push @replaced_data, $s; }, "dtext" ); # Handlerroutine für Kommentare registrieren $p->handler( comment => sub { return "" }, "text" ); # Handlerroutine für PHP und anderes mit <? ?> $p->handler( process => sub { return "" }, "text" ); # HTML nun parsen und ändern $p->parse($source); # stop parsing $p->eof(); my $data = join "", @replaced_data; return substr( $data, 0, $maxlen ) . '…'; } ## end sub shorten print "Content-Type: text/html; charset: utf-8\n\n"; print "<!DOCTYPE HTML> <html> <body> <p>$data</p> </body> </html> ";
# $data wird aus einer Datei gefüllt
2023-05-09T15:27:07 GwenDragonJa, utf8_mode hab ich eingesetzt, damit Entities dekodiert werden.
2023-05-09T15:27:07 GwenDragonDu meinst, ich soll dann noch das nehmen, um von einem Byte-Stream nach Characters zu kommen, damit substr() korrekt abtrennt?
$data = Encode::decode('utf-8', $data);
binmode STDOUT,':encoding(UTF-8)';
1 2 3 4 5 6 7 8 9 10
use strict; use warnings; use Encode; my $binary = 'äöü'; # Rohdaten # Kodierung einschalten my $chars = Encode::decode("utf-8", $binary); my $substr = substr($chars, 0, 2); use bytes; # für print die Kodierung wieder ausschalten print $substr; # äö
2023-05-09T16:42:11 rostiEs ist halt ab und an ziemlich aufwändig raus zu bekommen, ob byte- oder zeichenorientiert gearbeitet wird, sicher, es lässt sich im Quellcode suchen.Das Problem ist, daß man bei Perlmodulen oft nicht weiß ob die zeichenorientiert oder byteorientiert arbeiten. Hinzu kommt daß beim
Provider Module wie z.B. JSOM.pm bez. Kodierung anders arbeiten als auf der eigenen Windows-Kiste.
1 2 3 4 5 6
my $data = join "", @replaced_data; $data = Encode::decode("utf-8", $data); $data = substr( $data, 0, $maxlen ); use bytes; return $data . '…';