CrazyMaze: Welches "Zeichen" ist ein Carriage Return???

Hallo Ihr,

ich zerlege per JS den Inhalt einer Textarea und verarbeite jedes Zeichen einzeln weiter.

Vereinfacht:

Zeichen i => Mache dies...
i++
Zeichen i => Mache das...
i++
...

Problem:

Zeilenumbrüche werden überlesen.

Wie erkenne ich auf die Art und Weise einen Carriage Return?
Die Wege:

if (Zeichen == "/n")
if (Zeichen == "%0A%0D")

funktionieren leider nicht.

Hat jemand vielleicht einen Tip?

Danke!
Uli

  1. Hallo Uli,

    \b Backspace
    \f Seitenvorschub (Form Feed)
    \n Zeilenvorschub (New Line)
    \r Wagenrücklauf (Carriage Return)
    \t Tabulator

    Ich hoffe, ich konnte dir weiterhelfen...

    Schönen Gruß aus München

    die knappschaft

    --

    sh:(  fo:|  ch:?  rl:°  br:$,<,>  n4:&  ie:|  mo:|  va:)  de:]  zu:)  fl:|  ss:|  ls:[,#
    1. »»Die Wege:

      »»if (Zeichen == "/n")
      »»if (Zeichen == "%0A%0D")

      »»funktionieren leider nicht.

      Ne, das hat nicht geholfen. Siehe Original-Nachricht...

      Uli

      1. »»if (Zeichen == "/n")

        ^^^^^

        Hoppla... Ich meine natürlich \ und nicht /. ;-)

        Passiert in der Eile.

        Uli

      2. Hallo

        »»if (Zeichen == "\n")

        Das ist nur bei UNIX-Systemen so. Bei Windows ist der Zeilenwechsel \r oder \n\r.

        »»if (Zeichen == "%0A%0D")

        Das sind _zwei_ Zeichen. Zwei Zeichen können niemals gleich einem Zeichen sein.

        Wie ermittelst Du die Variable Zeichen?
        Was willst Du eigentlich erreichen?

        Probier mal folgendes, um herauszufinden, welchen Code Deine Zeilenwechsel haben. Denke aber daran, dass dieser Code Systemabhängig ist.

        <html>
        <head>
        <title></title>
        <script type="text/javascript">
        <!--
        function inhaltTE() {
          var inh = document.getElementById("te").firstChild?document.getElementById("te").firstChild.nodeValue:"";
          for (var i=0; i<inh.length; i++) {
              c = inh.charAt(i);
              alert(c + " = " + escape(c));
              if (c == "\r") alert("Zeilenwechsel");
          }
        }
        //-->
        </script>
        <noscript></noscript>
        </head>
        <body>
        <textarea id="te"></textarea>
        <input type="button" name="" value="OK" onclick="inhaltTE();">
        </form>
        </body>
        </html>
        viele Grüße

        Axel

        1. Donnerwetter, das hatte geklappt. %0D ist also der Carriage Return.
          Jetzt muss ich mir nur noch überlegen, wie ich den weiterverarbeite.

          Besten Dank!

          Uli

          1. Hi CrazyMaze

            Donnerwetter, das hatte geklappt. %0D ist also der Carriage Return.

            Nein, eben genau nicht, das ist systemabhängig.

            \n auf Unix und MacOS >= 10
            \r auf MacOS < 10
            \r\n auf Windows

            auf die Belegung von \n und \r darfst du dich aber laut der
            RFC auch nicht verlassen sondern musst die numerischen Codes
            dafür nehmen die nicht bei allen Charactersets identisch
            sind.

            Gruss Daniela

            --
            Nein, wir frieren unsere Hühner nicht auf Gletschern fest.
            1. \n auf Unix und MacOS >= 10
              \r auf MacOS < 10
              \r\n auf Windows

              Hmm, na das ist nun wieder nicht so schön. Fragt sich nur, wie ich an diese ganzen numerischen Codes komme.

              Und ich dachte leichtgläubig, dass ascii gleich ascii ist.

              Grüsse
              Uli

              1. Hi CrazyMaze

                \n auf Unix und MacOS >= 10
                \r auf MacOS < 10
                \r\n auf Windows

                Hmm, na das ist nun wieder nicht so schön. Fragt sich nur, wie ich an diese ganzen numerischen Codes komme.

                Die findest du leicht im Archiv für ascii und Abkömmlinge,
                einen davon hast du ja schon, ich weis nur nicht auswändig,
                welchen der beiden.

                Und ich dachte leichtgläubig, dass ascii gleich ascii ist.

                Ok, letzteres ist eher etwas theoretisch in deiner Anwendung,
                es gibt auch Zeichensätze, die nichts mit Ascii zu tun haben,
                zb EBCDIC.

                In der Praxis ist es äusserst unwahrscheinlich dass du auf
                sowas stösst, ich kenne auch kein Script, dass sowas berück-
                sichtigt. Zudem kommt hinzu, dass, wenn ich die RFC richtig
                im Kopf habe, der Client die Daten so codiert schicken muss,
                wie du es spezifiziert hast (Page Encoding).

                Gruss Daniela

                --
                Nein, wir frieren unsere Hühner nicht auf Gletschern fest.
                1. Hi Daniela,

                  na warum einfach, wenn es auch so schön umständlich geht. Irgendwie wird mir da schon etwas einfallen. Da sind mir also viele neue graue Haare und lange Abende sicher. ;-)

                  Danke für die vielen Infos!

                  Uli

              2. Hallo,

                \n auf Unix und MacOS >= 10
                \r auf MacOS < 10
                \r\n auf Windows

                Hmm, na das ist nun wieder nicht so schön. Fragt sich nur, wie ich an diese ganzen numerischen Codes komme.

                Am Besten wird es sein, Du bringst erst mal alle Möglichkeiten auf den kleinsten Nenner. Das ist, meiner Meinung nach \n. Das könntest Du mit einem string.replace und einer RegExp erreichen.
                http://selfhtml.teamone.de/javascript/objekte/string.htm#replace

                Das könnte in etwa so aussehen:
                  inh = inh.replace(/[\r|\n|\r\n]+/g,"\n");

                Die RegExp-Experten mögen mich berichtigen, wenn das nicht stimmt.

                Dann musst Du nur noch eine Variante abfragen:

                <html>
                <head>
                <title></title>
                <script type="text/javascript">
                <!--
                function inhaltTE() {
                  var inh = document.getElementById("te").firstChild?document.getElementById("te").firstChild.nodeValue:"";
                  inh = inh.replace(/[\r|\n|\r\n]+/g,"\n");
                  for (var i=0; i<inh.length; i++) {
                      c = inh.charAt(i);
                      alert(c + " = " + escape(c));
                      if (c == unescape("%0A")) alert("Zeilenwechsel");
                  }
                }
                //-->
                </script>
                <noscript></noscript>
                </head>
                <body>
                <textarea id="te"></textarea>
                <input type="button" name="" value="OK" onclick="inhaltTE();">
                </form>
                </body>
                </html>

                viele Grüße

                Axel

                1. Hallo,

                  Am Besten wird es sein, Du bringst erst mal alle Möglichkeiten auf den kleinsten Nenner. Das ist, meiner Meinung nach \n. Das könntest Du mit einem string.replace und einer RegExp erreichen.
                  http://selfhtml.teamone.de/javascript/objekte/string.htm#replace

                  Das könnte in etwa so aussehen:
                    inh = inh.replace(/[\r|\n|\r\n]+/g,"\n");

                  Das ist leider nicht die Lösung.

                  fragei dich erst, ob der Benutzer berechigt war, das Ersatzzeichen in den Text einzufügen, wenn ja, wähle ein anderes, wenn nein,

                  tausche das Ersatzzeichen gegen ein neutrales Element (z.B. #32)

                  tausche dann alle #13#10 gegen das Ersatzzeichen (z.B. #127)
                  tausche dann alle verbliebenen einzelnen #13 gegen das Ersatzzeichen
                  tausche dann alle vernliebenen einzelnen #10 gegen das Ersatzzeichen

                  Danach kannst Du die Texte so verarbeiten und speichern, wie es Dir beliebt. Vor der Auslieferung an den Browser fragst Du Dich dann erst, wohin???

                  • Textarea
                  • HTML-Normaltext

                  Entsprechend musst Du das Ersatzzeichen zurücktauschen und/oder zusätzliche Maßnahmen ergreifen (stripslashes, htmlentities, 127to<br>, usw...

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  --
                  Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
        2. Hi,

          1. Backslash ist nicht gleich Slash. Das Zeichen heißt "\n" und nicht "/n"
          2. #10#13 ist nicht gleich #13#10. Die Zeichenfolge in DOS-basierten Dateien heißt daher %0D%OA und nicht %0A%0D. Man kann auch \r\n dafür schreiben.
          3. Wenn man nur eines der beiden Zeichen ersetzt, stellt ein Windows-Browser automatisch das fehlende Zeichen wieder her.
          4. Wenn man nach den zeichen sucht, darf man nicht "\r\n" ,also die Mnemonics der Zeichen verwenden, da die von jedem System wieder nahc seinen eigenen Vorstellungen übersetzt werden. \n wird auf dem MAC zu #13 und auf dem Linux zu #10.

          Es wird hier an so vielen Stellen gebogen und getauscht, dass nur reine Binärvergleiche zum Ziel führen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.