Sebastian: Sonderzeichenproblem

Hi Leute hab nen Problem mit Sonderzeichen!!!

Will nen GB mit Perl programmieren.
Dann hol ich mir den ENV{QUERE_STRING} und da sind dann sonderzeichen wie + oder so nicht mehr als Plus drin.
Wie bekomme ich die wieder in die normalen Sonderzeichen ohne das ich für jedes einzelne Zeichen nen neuen s/../../; machen muss.

Gruß Sebastian

  1. Warum bleibst du nicht im ursprünglichen Thread?

    [pref:t=71644&m=412505]

    Warum verwendest du nicht CGI.pm? Ich glaube du hast vor einigen Tagen schon mal gepostet und da habe ich das auch vorgeschlagen.

    1. Das war ich nicht, aber egal, wahrscheinlich einer aus meiner Klasse, weil wir alle das selbe Problem haben.
      Sag mal wie benutze ich den dieses komische
      CGI.pm?????
      Gurß Sebastian

      1. CGI.pm ist AFAIK bei Perl seit Version 5.005 dabei. Du musst es nur mit
        use CGI; einbinden. Natürlich solltest du schon vorher wissen, wie du es benutzt. http://www.perldoc.com/perl5.8.0/lib/CGI.html

        Markus Trusk.

        1. Kannst de mir das mal erklären, ich kann mit dem Link nichts anfangen, wie benutze ich das wenn ich ne Variable mit dem Namen $test habe.

          Gruß sebastian

          1. Sup!

            Wenn Du schlau genug wärst, zu suchen, würdest Du sicher auch herausfinden, auf welch' geheimnisvolle Weise die Sonderzeichen durch "komische Zeichen" ersetzt werden, und wie man diese mysteriöse Transformation wieder rückgängig machen kann.

            RFC 1738 wäre z.B. ein Ansatzpunkt, da steht drin, welche Zeichen wie von der s.g. "Escape"-Funktion umgewandelt werden.

            Gruesse,

            Bio

            --
            Eine verwirrende Antwort ist gut, weil sie den Leser zum Nachdenken bringt.
            1. Ich habe schon gesucht und brauche es umbedingt bis nächste Woche Dienstag, für die Schule
              Gruß Sebastian
              Falst du weißt wie es geht, sag es mir

              1. Hallo,

                Ich habe schon gesucht und brauche es umbedingt bis nächste Woche Dienstag, für die Schule

                Da Du[1] offensichtlich enorme Probleme mit der Lösung des Problems hast, würde mich einmal die genaue Aufgabenstellung interessieren. Weil wenn Du so gar nicht damit klarkommst, verlangt Dein Lehrer entweder zu viel oder Du bist vollkommen auf dem falschen Weg unterwegs[2].

                BTW:
                Im Modul CGI wird das Auslesen von $ENV{QUERE_STRING} behandelt. Mit dabei ist auch die Umwandlung der Daten ('Sonderzeichenbehandlung'). So nebenbei werden auch Fälle wie die HTTP-POST_Methode (die nicht  $ENV{QUERE_STRING} für das Senden der Daten verwendet) behandelt.

                Das Studium des Quelltexts dieses Moduls könnte wertvolle Informationen liefern, wenn Du das Auslesen der Daten selbst programmieren willst oder mußt.

                Grüße
                  Klaus

                [1] und anscheindend auch mindestens noch jemand aus Deiner Klasse;-)
                [2] die dritte Option wäre noch, dass Du den Stoff noch nicht gelernt hast und nun etwas 'schwimmst', aber so etwas wage ich nicht mal wirklich zu denken;-)

                1. Der Skript ist ja schon fertig nur das umwandel der Sonderzeichen ist etwas kompliziert, das waren sonst mehrere Zeilen, da wollte ich wissen ob man die nicht schnell umwandel kann.

                  1. Hallo,

                    Der Skript ist ja schon fertig

                    Anscheinend aber nicht ganz;-)

                    nur das umwandel der Sonderzeichen ist etwas kompliziert,

                    nicht wirklich, wenn man weiss, wie es geht (die RFC wurde ja schon gepostet)

                    Es bleiben Dir imho folgende sinnvolle Optionen:
                    1.) Du lernst anhand der gepostet RFC, wie die Daten zum Server gelangen und programmierst eine eigene Umwandlungsroutine.
                       (Das ist aber mit erheblichem Lern- und etwas Arbeitsaufwand verbunden)

                    2.) Du kopierst Dir den Code irgendwo her, wobei Du eventuell Quellen verwendest, welche eine unzureichende Implementierung durchgeführt haben (es geistern ziemlich viel halbfertige Code-Fragmente im Netz herum).
                    Das Problem dabei ist, dass DU nichts davon verstanden hast, also auch nicht in der Lage bist, eventuelle Fehler zu beheben.

                    3.) Du benutzt eine ausgereifte, da oft verwendete, Bibliothek, die Dir die Arbeit abnimmt (CGI.pm).
                    Du hast dann zwar noch immer nicht verstanden, wie das Umwandeln geht, kannst aber sicher sein, dass sie funktioniert.
                    (Und der Lernaufwand für das Einbinden des Moduls ist gering)

                    das waren sonst mehrere Zeilen, da wollte ich wissen ob man die nicht schnell umwandel kann.

                    Im Falle der Bibliothek:
                    1 Zeile zum Einbinden.
                    1 Zeile zum Intialisieren (optional)
                    mind. 1 Zeile pro übergebenem Parameter beim Auslesen

                    (Zeile ist eigentlich nicht richtig, richtiger wäre Anweisung;-)

                    Grüße
                      Klaus

                    PS: Du bist Schüler, Dein Job heisst Lernen und nicht Abschreiben. Mache Deinen Job.

                    1. Das ist ja das Problem, sonst hätte ich für jedes einzelnie Zeichen eine eigene Anweisung gebraucht.
                      Da wollte ich wissen ob es dafür keine Routine gibt.

                      Gruß
                          Sebastian

              2. Sup!

                Okay... in der RFC, die ich erwähnte, steht sinngemäss, dass einige Zeichen aus bestimmten Gründen "escaped" werden müssen, weil sie sonst eine Sonderbedeutung hätten, z.B. '?','&','#' etc..

                Diese Zeichen werden dann als %XX geschrieben, wobei XX die Hex-Zahl für den Zeichencode ist.

                Die Zurück-Umwandlung geschieht also, indem diese drei Zeichen wieder zurückgewandelt werden in ein Zeichen.

                Das könnte z.B. so gehen:

                $query =~ s/%(..)/chr(hex($1))/g;

                (Ersetze % und die darauffolgenden zwei Zeichen durch das Zeichen, was rauskommt, wenn man die zwei auf % folgenden Zeichen als Hexzahl und diese Zahl als ASCII-Zeichen interpretiert).

                Gruesse,

                Bio

                --
                Eine verwirrende Antwort ist gut, weil sie den Leser zum Nachdenken bringt.
                1. $query =~ s/%(..)/chr(hex($1))/g;

                  Sowas ähnliches habe ich ja schon gemacht, aber das für jedes Zeichen zu machen dauert verdammt lange.

                  1. Sup!

                    $query =~ s/%(..)/chr(hex($1))/g;
                    Sowas ähnliches habe ich ja schon gemacht, aber das für jedes Zeichen zu machen dauert verdammt lange.

                    Die o.g. Zeile macht das ja auch alles auf einmal, wegen des g-modifiers am Ende, und das dauert garantiert nichtmal bei einem P100 "lange".

                    Gruesse,

                    Bio

                    --
                    Eine verwirrende Antwort ist gut, weil sie den Leser zum Nachdenken bringt.
                    1. Die o.g. Zeile macht das ja auch alles auf einmal, wegen des g-modifiers am Ende, und das dauert garantiert nichtmal bei einem P100 "lange".

                      Das funktioniert mit allen sonderzeichen auf einmal???

                      1. Hallo,

                        Die o.g. Zeile macht das ja auch alles auf einmal, wegen des g-modifiers am Ende, und das dauert garantiert nichtmal bei einem P100 "lange".
                        Das funktioniert mit allen sonderzeichen auf einmal???

                        _Genau_ das habe ich gemeint mit 'Das Problem dabei ist, dass Du nichts davon verstanden hast, also auch nicht in der Lage bist, eventuelle Fehler zu beheben.'!

                        Du hast die GRundlagen nicht im Griff.
                        Lerne zu verstehen, was die von Bio gepostete Anweisung macht, und welche mögliche Fälle sie nicht abdeckt.
                        Und noch etwas: $ENV{QUERE_STRING} ist nur unter bestimmten Umständen mit dem Inhalt der Parameter gefüllt. Kennst Du diese Umstände? Und weisst Du, wie man darauf reagiert, wenn sie nicht eingetreten sind?

                        Wenn dem nicht so ist, und ich Dein Lehrer wäre, dann würdest Du mit Deiner Lösung wirkliche Probleme mit mir bekommen. Wenn Dein Lehrer das nicht so sieht, dann bist wiederum Du der Angeschmierte, denn dann bringt er Dir nicht das Richtige bei. Ziemlich blöde Situation, in der Du steckst.

                        Grüße
                          Klaus

                      2. Sup!

                        Die o.g. Zeile macht das ja auch alles auf einmal, wegen des g-modifiers am Ende, und das dauert garantiert nichtmal bei einem P100 "lange".
                        Das funktioniert mit allen sonderzeichen auf einmal???

                        Abgesehen davon, dass Klaus Mock natürlich Recht hat, würde ich Dir empfehlen, "Programming Perl" von Larry Wall zu lesen, oder "Programmieren in Perl", wie es auf Deutsch heisst.

                        Das Kapitel über reguläre Ausdrücke z.B. - aber http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm dürfte auch reichen, so wenig, wie Du über reguläre Ausdrücke weisst.
                        Warum hast Du das noch nicht gelesen?

                        Wie auch immer, mit dem =~ Operator wendet man einen regulären Ausdruck auf einen String an.

                        Das Zusammenbasteln von regulären Ausdrücken ist einigermassen schwierig, denn es gibt sehr viele Möglichkeiten.
                        Wenn Du das nicht verstehst (bis Dienstag) dann schreib' besser eine Schleife, die gezielt nach % sucht, und dann die nächsten zwei Zeichen ausschneidet, umwandelt, etc..

                        Gruesse,

                        Bio

                        --
                        Eine verwirrende Antwort ist gut, weil sie den Leser zum Nachdenken bringt.
          2. Du sagst du hast ein Gästebuch. D.H du hast eine Art Eingabeformular.
            Angenommen dein <input> Tag sieht so aus

            <input type="text" name="test" value="">

            und sendest jetzt die Daten an das CGI Script, dann kannst du die Daten mit Hilfe von CGI.pm ganz einfach rausholen und zB in einer Variable speichern. CGI.pm kümmert sich um die Kodierungen usw, dH du musst dich nicht mehr um Probleme dieser Art kümmern und obendrein ist es auch noch sicherer, CGI.pm zu benutzen. Im oberen Fall sieht das dann zB so aus:

            #!/usr/bin/perl -w

            use strict;
            use CGI;

            my $query = new CGI;
            my $test = $query->param('test'); #übermittelte Daten von "test" in der Variable $test speichern.

            print $query->header; #Header mit Hilfe von CGI.pm ausgeben.
            print $test; #übermittelte Daten ausgeben.

            Markus Trusk.

            1. »»my $test = $query->param('test'); #übermittelte Daten von "test"
              »»in der Variable $test speichern.

              Wir da nur der Teil des ENV{Query_String} geladen der Test heißt???

              print $query->header; #Header mit Hilfe von CGI.pm ausgeben.

              Brauch ich den Teil überhaupt????

              print $test; #übermittelte Daten ausgeben.

              Das brauch ich doch nur wenn ich sie ausgeben will oder?

              1. my $test = $query->param('test'); #übermittelte Daten von "test"
                in der Variable $test speichern.

                Wir da nur der Teil des ENV{Query_String} geladen der Test heißt???

                Hast du in meinem Bsp. auch andere Teile gesehen?

                print $query->header; #Header mit Hilfe von CGI.pm ausgeben.
                Brauch ich den Teil überhaupt????

                Nur wenn du etwas ausgeben willst.

                print $test; #übermittelte Daten ausgeben.
                Das brauch ich doch nur wenn ich sie ausgeben will oder?

                Ja.

                hast du eigentlich überhaupt irgendwie Ahnung davon, was du machst? Das soll nur ein Bsp. sein, dass die übermittelten Daten ausgibt. Ob du das brauchst, kannst nur du dir beantworten.

                Markus Trusk.

                1. hast du eigentlich überhaupt irgendwie Ahnung davon, was du machst? Das soll nur ein Bsp. sein, dass die übermittelten Daten ausgibt. Ob du das brauchst, kannst nur du dir beantworten.

                  Ja aber wenn man sich mit einem Modul garnicht auskennt, dann muss man doch mal nachfragen dürfen, ich muss das ganze dann nur noch in den Script einbinden

                  Gruß Sebastian

    2. use Mosche;

      Warum bleibst du nicht im ursprünglichen Thread?

      [pref:t=71644&m=412505]

      siehe [pref:t=71507&m=411614]

      use Tschoe qw(Matti);

      --
        Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
      1. use Mosche;

        Warum bleibst du nicht im ursprünglichen Thread?

        [pref:t=71644&m=412505]

        siehe [pref:t=71507&m=411614]

        use Tschoe qw(Matti);

        Warum ich da nicht drin bleibe, weil ich der Nicht bin, das ist einer aus meiner Klasse der das auch braucht und ich das nicht über die Online suche gefunden habe. Deswegen

    3. Sup!

      Hoho! Jetzt heisst Du also Markus Trusk!

      Deine Nicks werden auch immer abstruser!

      ;-)

      Gruesse,

      Bio

      --
      Lieber einen guten Freund verlieren als einen guten Witz auslassen!