Paul Brunner: URL decoding

Hallo,

Ich versuche den Inhalt eine Formularfeldes in eine Datei zu schreiben, die Umlaute bringen mich zur Verzweiflung:

Der Ablauf:

  • Feld einlesen: CGI::Request->param('foo');
  • Inhalt URL-decodieren: $foo =~ s/%(..)/pack("C",hex($1))/eg;
  • in Datei schreiben: print FH $foo;

Das Problem:

  • Formular: äöüÖÄÜß
  • Ergebnis: äöüÃÃÃÃ

Wie kriege ich die Umlaute korrekt rüber?

Gruss
Paul

  1. Wie kriege ich die Umlaute korrekt rüber?

    Benutze doch das CGI Modul, das ist dafür da und wandelt alles automatisch um.

    use CGI;
    my $foo = CGI::param('foo');

    print FH $foo;

    Struppi.

    1. Hallo Struppi,

      Benutze doch das CGI Modul, das ist dafür da und wandelt alles automatisch um.

      Das dachte ich auch, ist aber wohl nicht der Fall:

      print FH $foo;

      Ausgabe Datei: öü����

      print $foo;
      Ausgabe STOUT: öäüÖÄÜß

      Irgendwo ist da noch der Wurm drin.

      Gruß
      Paul

      1. print FH $foo;
        Ausgabe Datei: öü����

        print $foo;
        Ausgabe STOUT: öäüÖÄÜß

        Irgendwo ist da noch der Wurm drin.

        Was für einen Zeichensatz verwendest du auf deiner Seite?

        Struppi.

        1. Was für einen Zeichensatz verwendest du auf deiner Seite?

          ISO-8859-1

          Paul

          1. Hallo,

            bist du sicher dass das der browser auch so sieht?

            gruss

            --
            no strict;
            no warnings;
            Über eine Rückmeldung freut sich später jeder, der das gleiche Problem hat und im Archiv nach einer Lösung sucht.
            1. Hallo,

              bist du sicher dass das der browser auch so sieht?

              Denn Inhalt der Datei kann ich direkt per FTP überprüfen.

              Das Problem tritt schon beim schreiben und nicht erst beim erneuten einlesen und wieder anzeigen auf.

              Gruss
              Paul

      2. Moin!

        print FH $foo;
        Ausgabe Datei: öü����

        print $foo;
        Ausgabe STOUT: öäüÖÄÜß

        Irgendwo ist da noch der Wurm drin.

        Nicht der Wurm ist drin, sondern UTF-8.

        - Sven Rautenberg

        1. Guten Abend,

          Nicht der Wurm ist drin, sondern UTF-8.

          Wieso liefert CGI.pm im UTF-Format und wie kann ich das umstellen?

          Gruss
          Paul

          1. Moin!

            Nicht der Wurm ist drin, sondern UTF-8.

            Wieso liefert CGI.pm im UTF-Format und wie kann ich das umstellen?

            Tut es nicht. Dein Browser liefert im UTF-8-Format. Warum auch immer...

            Du solltest in deinem Formular in jedem Fall ein accept-charset angeben, und dieses auf den benötigten Zeichensatz einstellen.

            Bedenke: ISO-8859-1 enthält KEIN Eurozeichen. Wenn du ein Eurozeichen brauchst, und allgemein sicher sein willst, dass der Browser alle eingebbaren Zeichen auch abschicken kann, dann verwende UTF-8. Ansonsten kriegst du in letzter Konsequenz von den Browsern nur unverwertbaren Müll! Das sieht auf den ersten Blick zwar nicht so aus, aber es ist so. Manche Browser denken sich nämlich sehr abenteuerliche Aktionen aus, wenn es darum geht, mit im gewünschten Zeichensatz nichtcodierbaren Zeichen umzugehen.

            - Sven Rautenberg

            1. Hallo,

              Tut es nicht. Dein Browser liefert im UTF-8-Format. Warum auch immer...

              Also... der Browser schickt die Daten des Formulares in dem durch die HTML-Formular-Seite festgelegten Zeichensatz, bei denen wiederum im original Query-String alle nicht ASCII-Zeichen URL-encoded sind?

              Du solltest in deinem Formular in jedem Fall ein accept-charset angeben, und dieses auf den benötigten Zeichensatz einstellen.

              Das accept-charset-Attribut hat schließlich geholfen, obwohl zumindest im Testfall für Mozilla das entsprechende meta-Tag auch ausgereichet haben sollte.

              Danke
              Paul

              1. Hallo Paul,

                Tut es nicht. Dein Browser liefert im UTF-8-Format. Warum auch
                immer...

                Also... der Browser schickt die Daten des Formulares in dem durch
                die HTML-Formular-Seite festgelegten Zeichensatz, bei denen
                wiederum im original Query-String alle nicht ASCII-Zeichen
                URL-encoded sind?

                Theoretisch ja.
                Faktisch gibt es da leider Besonderheiten. Der Mozilla, der IE und
                einige der Mac-Browser schicken Windows-1285 (oder so), wenn ein
                Euro-Zeichen in einer Latin1-Seite eingegeben wurde. Der Mozilla
                schickt &#<unicode-nr>; wenn das Zeichen, das man eingibt, im
                Zeichensatz der Seite nicht vorhanden ist, ohne jedoch die anderen
                Zeichen nachzubehandeln (z. B. um aus < &aml;lt; zu machen,
                damit man unterscheiden kann, was der Browser gemacht hat und was
                der User eingegeben hat). Konqueror nimmt stattdessen ein
                Fragezeichen für das betreffende Zeichen.

                Du solltest in deinem Formular in jedem Fall ein accept-charset angeben, und dieses auf den benötigten Zeichensatz einstellen.

                Das accept-charset-Attribut hat schließlich geholfen, obwohl
                zumindest im Testfall für Mozilla das entsprechende meta-Tag
                auch ausgereichet haben sollte.

                Mozilla ignoriert das accept-charset-Attribut.

                Grüße,
                 CK

                --
                Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
                http://wwwtech.de/
                1. Hallo Christian,

                  Theoretisch ja.
                  Faktisch gibt es da leider Besonderheiten. [...]

                  Mozilla ignoriert das accept-charset-Attribut.

                  Zwischen durch ging es mal wunderbar in Mozilla, IE6 und OP7, jetzt tuts wieder nicht mehr :-((

                  Ich habe inzwischen komplett auf UTF-8 umgestellt (alle html, xml und xsl files). Geholfen hats nicht.

                  Gruss
                  Paul

  2. Hallo,

    Das Problem:

    • Formular: äöüÖÄÜß
    • Ergebnis: äöüÃÃÃÃ

    Wie kriege ich die Umlaute korrekt rüber?

    Mit demselben Zeichensatz wie die Datei geschrieben wird sollte sie auch wieder ausgelesen werden.

    Gruss, Rolf

    --
    50 Millionen Deutsche können nicht richtig HTML!