Thomas Scholz: "wrap=physical" gibt keinen Zeilenumbruch !!

Hallo zusammen !

Leider habe ich auch im Forumarchiv keine Antwort zur Frage gefunden: "Warum schreibt wrap=physical keinen echten Zeilenumbruch in den an ein CGI übergebenen Text ?"

Laut meiner Tests ist dies leider wirklich so. Weder im Netscape 4.5 noch bei MSIE 4.0 wird ein automatischer Umbruch physikalisch als 0Dh übergeben.

Die letzten Beiträge waren schon etwas älter. Deshalb hoffe ich, daß jetzt jemand eine HTML-Lösung hat dieses Manko zu beheben.

Thanks Euch

Thomas

  1. Hallo Thomas !

    Habe mir cgi-seitig so geholfen:

    $value =~ s/\n/<br>/g;

    Aber vielleicht gibt es ja eine bessere Lösung.

    Gruß
    Jörg

    1. Hallo Thomas !

      Habe mir cgi-seitig so geholfen:

      $value =~ s/\n/
      /g;

      Aber vielleicht gibt es ja eine bessere Lösung.

      Gruß
      Jörg

      Hallo alle zusammen,
      genau das ist eine einfache Lösung!
      Eine kleine Ergänzung vielleicht noch:
      Mit der Verwendung der cgi-lib.pl kann das Auslesen der Inputfelder sehr vereinfacht werden. Die physikalischen Zeilenumbrüche können so wie folgt im Script ganz einfach nach HTML umgewandelt werden:

      $in{'feldname'} =~ s/\n/&ltbr&gt/g;

      Viele Grüße, Rolf

  2. Hallo Zusammen !

    Es gibt Dinge die lassen einen nicht los. Nur ein paar Klicks nachdem ich diese Frage ins Forum postete viel mir im WEB.DE-Perl-Forum die Grundlage von einer/em Keita Ito für eine Lösung in die Hände.
    Diese hat einen Endlostext mit Zeilenumbrüchen erweitert. Nach ein wenig fummeln läuft es jetzt auch mit absichtlich eingefügten Umbrüchen.

    Eins steht für mich, wie schon geschrieben, fest. Weder Netscape noch MSIE können "wrap=physical" richtig verarbeiten! Es gibt scheinbar nur die Möglichkeit den übergebenen Text mit Perl zu bearbeiten um Ihn z.B. formatiert in eine Textdatei zu schreiben.

    Als erstes müssen, zu den allgemein bekannten (siehe SELFHTML 7.0), Datenfiltern für CGI-Übergabe noch zwei weitere hinzugefügt werden.

    ...
         $value =~ tr/+/ /;
         $value =~ s/%0d/`/gi; # ersetzt Hex 0D durch ASCII 96 (selten gebraucht, aber nachfolgend nicht gefiltert)
         $value =~ s/%0a//gi;  # löscht Hex 0A
         $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
         ...

    Dann wird der String noch komplett zerlegt und mit den richtigen Zeilenumbrüchen "\n" wieder zusammengesetzt.

    ################### Text aufbereiten

    $Temp = $Text;

    while (length($Temp)>63)                                  # die 63 ist max. Zeilenlänge
    {
      $Umbruch = rindex ($Temp,"",63);     # auf ASCII 96 (also Zeilenumbruch) in der ersten Zeile suchen   if ($Umbruch != -1)                   # wenn Umbruch vorhanden    {    $Temp =~ s/(.{$Umbruch})//;  # bis Umbruch auschneiden
       $Neu .= "\n".$1;              # und mit neuem Umbruch "\n" nn $Neu anhängen
      }
      $Zeile = rindex ($Temp," ",63);       # dann Zeilenumbruch nach Wort bearbeiten
      $Temp =~ s/(.{$Zeile}) //;
      $Neu .= "\n".$1;
    }
    $Neu .= "\n".$Temp;

    $Neu =~s/`/\n/g;                               # zum Schluß ASCII 96 global gegen "\n" tauschen um auch Leerzeilen mitzunehmen
    $Text = $Neu;

    Mit "<br>" anstatt des "\n" geht es glaub ich auch mit HTML-Texten. Hab' ich bloß noch nicht versucht.

    An einer vielleicht möglichen Verkürzung der Prozedur wäre ich interessiert. Trotzdem hoffe ich einigen qualmenden Köpfen damit wieder etwas Ruhe zu gönnen.

    Viel Spaß noch

    Thomas

    1. Hallo Thomas!

      Ich muss zugeben, ich hab trotz des Perl-Codes noch nicht ganz begriffen, was das Problem ist.

      Also erstmal: Schickst Du das Formular mit GET oder POST ab? (Oder wird in beiden Faellen ein Zeilenumbruch als %0D%0A codiert?)

      Wie willst Du denn die Zeilenumbrueche bekommen? einfach als ASCII 0Ah? Wuerde dafuer nicht folgendes reichen?
          $value =~ tr/+/ /;      # + --> Leerzeichen
          $value =~ s/%0D//gi;    # %0D entfernen (wegen Plattformunabhaengigkeit)
          $value =~ s/%0A/\n/gi;  # %0A in ASCII 0Ah umwandeln (bzw. ASCII 0Dh 0Ah auf Windows-Systemen)
          $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/ge;     # uebrige Sonderzeichen decodieren

      Falls man das in HTML ausgeben will, kann man ja jetzt noch
          $value =~ s/\n/<BR>/g;
      durchfuehren.

      Also, was genau bekommst Du geliefert, und was genau willst Du haben?

      Calocybe