Perlhuhn: quotemeta() mit JavaScript un-quote

hallo,

die Perl-Funktion quotemeta() setzt ein escape auf bestimmte Sequenzen, zb. CR, CRLF u.a., d.h., die Sequenzen bekommen einen Backslash vorangestellt.

So escaped betanke ich übers Template ein Objekt im DOM. JS jedoch scheint den Backslash zu ignorieren, meine bisherigen Versuche, einen maskierten CR per JS.replace() zurückzuholen, greifen leider nicht. Als Workaround habe ich eine eigene Sequenz für den CR eingebaut, das ist jedoch unschön.

Schöner wäre eine JS-Funktion, die das Escaping einfach wieder rückgängig macht, gibt es sowas?
Oder was Anderes? Oder auch nicht ;)

--Legehennenexperte

  1. Hi,

    die Perl-Funktion quotemeta() setzt ein escape auf bestimmte Sequenzen, zb. CR, CRLF u.a., d.h., die Sequenzen bekommen einen Backslash vorangestellt.

    meinst du eine Funktion, die ein "echtes" \n in die zwei Zeichen Backslash, Kleinbuchstabe 'n' umwandelt?

    So escaped betanke ich übers Template ein Objekt im DOM. JS jedoch scheint den Backslash zu ignorieren

    Woraus schließt du das? Wenn du den String "Heute back ich\nMorgen brau ich" tatsächlich mit der Zeichenfolge Backslash, Kleinbuchstabe 'n' im Javascript-Kontext an den Client schickst, wird Javascript dort auch einen Zeilenumbruch (CR, 0x0D oder \n) erkennen.

    meine bisherigen Versuche, einen maskierten CR per JS.replace() zurückzuholen, greifen leider nicht.

    Nein, weil zu der Zeit, wo dein Javascript ausgeführt wird, kein maskiertes Zeichen mehr existiert (außer im Quellcode), sondern ein echter Zeilenumbruch.

    Als Workaround habe ich eine eigene Sequenz für den CR eingebaut, das ist jedoch unschön.

    Mir scheint, du versuchst ein Problem zu lösen, das gar nicht existiert.

    Schöner wäre eine JS-Funktion, die das Escaping einfach wieder rückgängig macht, gibt es sowas?

    Ja, das macht der Browser von ganz allein beim Parsen des empfangenen Quellcodes.

    So long,
     Martin

    PS: Der Beitrag wäre im Themenbereich JAVASCRIPT passender angesiedelt als in PERL.

    --
    Die letzten Worte des Polizisten:
    Ich hab mitgezählt, Leute: Sechs Schuss, jetzt hat er keine Munition mehr!
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. danke für Deine Mühe,

      Mir scheint, du versuchst ein Problem zu lösen, das gar nicht existiert.

      Wenn ich die \n drinlasse, geht es bereits bei der Zuweisung schief, im Browser sieht das so aus:

      val_plain = "Zeile1  
      Zeile2  
      ";  
      
      

      Einziger Weg, den ich sehe und der auch funktioniert: Ich ersetze für diese Zuweisung die CRLF durch jeweils ein %0A. Die Perl-Funktion quotemeta() lasse ich weg.

      Dann sehe ich im DOM, dass die Zuweisung ok ist. Und mit

      decodeURIComponent(val_plain);  
      
      

      hole ich die \n zurück. Eine andere Möglichkeit sehe ich nicht. Du vielleicht?

      Legehennenexperte

      1. Hallo,

        Mir scheint, du versuchst ein Problem zu lösen, das gar nicht existiert.
        Wenn ich die \n drinlasse, geht es bereits bei der Zuweisung schief, im Browser sieht das so aus:

        val_plain = "Zeile1

        Zeile2
        ";

          
        dann gibst du tatsächlich das Zeichen "Linefeed", also \n oder 0x0A an den Client aus, nicht die Zeichenfolge Backslash, Kleinbuchstabe 'n' - sorry, in meinem vorhergehenden Beitrag habe ich \n (LF, 0x0A) mit \r (CR, 0x0D) verwechselt.  
          
        
        > Einziger Weg, den ich sehe und der auch funktioniert: Ich ersetze für diese Zuweisung die CRLF durch jeweils ein %0A.  
          
        Nein, Codiere deine Ausgabe so, dass tatsächlich die zwei Zeichen Backslash, 'n' gesendet werden. Ich spreche kein Perl, kann dir also im Detail nicht helfen.  
          
        So long,  
         Martin  
        
        -- 
        Es sagte...  
        ein korpulenter Lehrer zu einem Schüler, der ihn ein Fass genannt hatte: "Nein. Ein Fass ist von Reifen umgeben, ich dagegen von Unreifen."  
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. hi Martin,

          Nein, Codiere deine Ausgabe so, dass tatsächlich die zwei Zeichen Backslash, 'n' gesendet werden.

          Vielen Dank, das hatte ich gestern auch übersehen: Nämlich dass es ZWEI Zeichen sein müssen. Mein erster Test sieht gut aus, ich mache da mal weiter, das wird!!!

          Ich spreche kein Perl, kann dir also im Detail nicht helfen.

          Wir sprechen Egal. Und in harnäckigen Fällen: Scheisegal.

          -Legehennenexperte