Beat: Sonderzeichen

Beitrag lesen

Kann man den folgenden CGI Script so bearbeiten, dass Sonderzeichen auf der "neuigkeiten.html" Seite richtig dargestellt werden? Bzw. Absätze übernommen werden, damit man im Formular nicht jedes Mal <br> schreiben muss.

Erst mal.
Speichere deine Scripte im gleichen Zeichensatz ob.
Vorzugsweise UTF-8 ohne BOM

Wenn du im Perlscript direkt Variablen definierst wie
my $example='äöü';

dann braucht perl zudem für UTF-8

use :utf8;

Dein Perlscript sollte einen httpheader mit der richtigen charset angabe ausgeben.

print "Content-Type:text/html; charset=UTF-8\n\n";

use CGI qw(:standard) ;

use strict;
use warnings;
use :utf8; # wegen direktem textinput "Gästenbuch";

@datei = "$pfad/$data" ;

Kein Array! sondern ein String

my $datei = $pfad .'/'.$data;

print header();

charset Angeben!

$kom = param("kommentar") ;

my...
Kopieren an diesem Punkt aber überflüssig!

open(FILE,"@datei");

open(INFILE '<', $datei) or die ('Fehler File '. $datei. $! );

@lines = <FILE>;

my @lines = <INFILE>;

close(FILE);

close(INFILE);

...

@monate = ('01','02','03','04','05','06','07','08','09','10','11','12');
      ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0,1,2,3,4,5,6];
      if ($mday < 10) { $mday = "0$mday"; }
      if ($year > 99) { $year = $year + 1900; }
      $date = "$mday.$monate[$mon].$year ";

hier wäre es besser mit sprintf() zu arbeiten.

my (undef,undef,undef,$mday,$mon,$year,undef) = localtime(time)
my $date = sprintf("%02.%02d.%04d",
                    $mday,  $mon+1, $year+1900 );

Eintrag ins Gästebuch hinzufügen:

open (FILE,">@datei");

open(OUTFILE '>', $datei) or die ('Fehler Schreiben von File '. $datei. $! );

foreach $line (@lines) {

foreach my $line (@lines) {

if ($line =~ /<!--name-->/) {
        print FILE "<!--name-->\n" ;

print OUTFILE...

print FILE qq~
        Eintrag am $date<br><br>

<b>$kom</b><br><br>

Einspruch. Dein $kom enthält eventuell HTML
also
         <b>~ . sanitize_html($kom) . qq~</b><br><br>

Zudem kann $kom an dieser Stelle leer sein...

<hr noshade size=2><br>
~
      }
      else {
        print FILE $line ;

print OUTFILE $line ;

}
   }
close (FILE);

close (OUTFILE);

verwende die Drei-Argumente-Form von open.
Verwende für Filehandles entweder
my $infh, my $outfh
oder INFILE, OUTFILE.
Grund: Lesbarkeit. gleich benannte Filehandes im gleichen Blockscope von Typ FILE sind Fehleranfällig.

sub sanitize_html{
  my $t = shift || '';
  $t=~ s/</&lt;/g;
  $t=~ s/>/&gt;/g;
  $t=~ s/&/&amp;/g;
  $t=~ s/"/&quot/g;
  return $t;
}

&ende ;

veraltet. Verwende:
ende();

sub ende {
print <<ENDE ;
        <div align="center"><br><br><br><br><br><br><br>
        Danke für Ihren Eintrag!
        <br><br>
        <a href="http://irgendeineseite.de">Zurück zum Gästebuch</a>
        <br><br><br><br><br><font size="-1">
        </font></div>
ENDE
}
sub fehler { print "<b>Fehler: Kein Name <br>Bitte geben Sie Ihren Namen an! <br><br><a href="javascript:history.back(-1)">zurück</a>";
last;
}
sub fehler1 { print "<b>Fehler: Keine Nachricht <br>Bitte füllen Sie das Formular neu aus! <br><br><a href="javascript:history.back(-1)">zurück</a>";
last;
}

mfg Beat

--
><o(((°>           ><o(((°>
   <°)))o><                     ><o(((°>o
Der Valigator leibt diese Fische