Ralf Steinert: %C3%B6sterreich -> Österreich umwandeln

Hallo,

kann mir jemand auf die Schnelle sagen wie ich einen Ausdruck der Art:
" %C3%B6sterreich" (aus der url eine Google-Suchabfrage) in Perl in die Form "Öterreich" bringe?

MfG Ralf

  1. Hallo Ralf!
    Sei in value dein String.

    $value =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;                # decode

    nun in value der decodierte String.

    Greets,
    Richard

    1. Hi,

      Alternative:
      use URI::Escape;

      gibt Dir die Funktionen
      uri_escape();
      uri_unescape();

      z.B:
      'gr%FCner%20B%E4r' <-- uri_escape('grüner Bär');

      --roro

      1. Hi,

        Alternative:
        use URI::Escape;

        gibt Dir die Funktionen
        uri_escape();
        uri_unescape();

        z.B:
        'gr%FCner%20B%E4r' <-- uri_escape('grüner Bär');

        --roro

        oder ohne Module:

        sub escape
                {
                        shift() if ref($_[0]);
                        my $toencode = shift;
                        return undef unless defined($toencode);
                        $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
                        return $toencode;
                }

        sub unescape
                {
                        shift() if ref($_[0]);
                        my $todecode = shift;
                        return undef unless defined($todecode);
                        $todecode =~ tr/+/ /;       # pluses become spaces
                        $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
                        return $todecode;
                }

        Reiner

        1. Hi Reiner,

          Alternative:
          use URI::Escape;

          oder ohne Module:

          bin ich i.d.R. auch dafür ;-)

          sub escape
                  {
                          shift() if ref($_[0]);
                          my $toencode = shift;
                          return undef unless defined($toencode);
                          $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
                          return $toencode;
                  }

          sub unescape
                  {
                          shift() if ref($_[0]);
                          my $todecode = shift;
                          return undef unless defined($todecode);
                          $todecode =~ tr/+/ /;       # pluses become spaces
                          $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
                          return $todecode;
                  }

          Cool! Endlich sehe ich beide Funktionen mal auf einer Seite.
          Ctrl + C ... und danke sagen.

          --roro

    2. Hallo Richard

      $value =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;                # decode

      nun in value der decodierte String.

      Dort steht jetzt "österreich".

      MfG Ralf

      1. hi,

        Dort steht jetzt "österreich".

        wo steht das? in Deinem Texteditor oder Console?

        Hinweis: Wenns von google kommt - %C3%B6sterreich - das ist UTF-8

        Vermutlich kann Deine Ausgabegerät kein UTF-8 oder ist nicht darauf umgestellt. Zum Testen mal im Browser ausgeben und Codierung UTF-8 einstellen, dann sollte ein kleines österreich zu sehen sein.

        --roro

        1. Hi,

          Dort steht jetzt "österreich".
          wo steht das? in Deinem Texteditor oder Console?

          im Browser in dem ich das ausgebe.

          Hinweis: Wenns von google kommt - %C3%B6sterreich - das ist UTF-8

          Ja, kommt es.

          Vermutlich kann Deine Ausgabegerät kein UTF-8 oder ist nicht darauf umgestellt. Zum Testen mal im Browser ausgeben und Codierung UTF-8 einstellen, dann sollte ein kleines österreich zu sehen sein.

          Ja, das geht. Aber kann man das nicht auch in reines ASCII umwandeln?

          MfG Ralf

          1. Hi,

            Vermutlich kann Deine Ausgabegerät kein UTF-8 oder ist nicht darauf umgestellt. Zum Testen mal im Browser ausgeben und Codierung UTF-8 einstellen, dann sollte ein kleines österreich zu sehen sein.
            Ja, das geht. Aber kann man das nicht auch in reines ASCII umwandeln?

            Hmm, Du meinst Latin... das geht. Hab derzeit meine PERL Doku nicht hier, sein mal sogut und such da mal nach unicode oder charset in Deiner PerlDoku, da gibts Module und Methoden.

            --roro

            1. Hi,

              Hmm, Du meinst Latin... das geht. Hab derzeit meine PERL Doku nicht hier, sein mal sogut und such da mal nach unicode oder charset in Deiner PerlDoku, da gibts Module und Methoden.

              Ich löse es jetzt erstmal damit, dass ich den Browser umstelle, bin etwas unter Zeitdruck.
              Auf jeden Fall vielen Dank.

              MfG Ralf

          2. Moin!

            Vermutlich kann Deine Ausgabegerät kein UTF-8 oder ist nicht darauf umgestellt. Zum Testen mal im Browser ausgeben und Codierung UTF-8 einstellen, dann sollte ein kleines österreich zu sehen sein.
            Ja, das geht. Aber kann man das nicht auch in reines ASCII umwandeln?

            ASCII ist ein gutes Stichwort (auch wenn ich mir sicher bin, dass du nicht wirklich ASCII gemeint hast):

            ASCII umfaßt nämlich streng gesehen nur 128 Zeichen (7 Bit) - und Umlaute sind nicht darunter! Das große Ö läßt sich also mit ASCII nicht codieren.

            Und wenn man annimmt, dass du ASCII in dem Sinn meintest, der sich technisch hinter ISO-8859-1 verbirgt, dann ist dort das große Ö enthalten und somit codierbar - allerdings gibt es noch mehrere hunderttausend Schriftzeichen, die mit ISO-8859-1 wieder nicht codiert werden können.

            Der simpelste Weg, um mit Zeichen umzugehen, die in UTF-8 codiert sind, ist die Umstellung der eigenen Codierung auf UTF-8 (alternativ auch jede andere Codierung, die den gesamten Unicode-Zeichenvorrat darstellen kann, und nicht nur begrenzte Ausschnitte wie "ASCII" oder "ISO-8859-1").

            - Sven Rautenberg

            --
            "Love your nation - respect the others."