Gast: Umlaute in der URL

Hallo,

ein altes Thema, das ich eigentlich gelöst hatte, poppt wieder auf.

URL-Parameter mit Umlaut werden von verschiedenen Browsern verschieden umgesetzt und gesendet. Meine Seiten sind UTF-8 codiert.

Eingabe in der Adresszeile: "&suche=Südhessen"
Opera macht davon "S%C3%BCdhessen"
Firefox belässt es bei "Südhessen" (nein, wandelt auch um, aber zeigt korrigiert an, man merkt es, wenn man die URL mit ctrl-C übernimmt)

In PHP übernehme ich das mit

$suche = utf8_encode($_GET['suche']);  
echo $suche;

echo-Anzeige: Südhessen

Da ich in der DB danach suche, gibt es kein Ergebnis. Was mache ich falsch?

Gast

  1. Hi,

    URL-Parameter mit Umlaut werden von verschiedenen Browsern verschieden umgesetzt und gesendet.

    normalerweise 1:1 so, wie sie im anfordernden Dokument stehen. In genau der Codierung.

    Meine Seiten sind UTF-8 codiert.
    Eingabe in der Adresszeile: "&suche=Südhessen"

    Die Codierung deiner Seiten ist aber irrelevant, wenn du von Hand etwas direkt in die Adresszeile eingibst. Da fehlt jegliche Angabe der Codierung. Der Browser wird also das verwenden, was für ihn als Default eingestellt ist.

    Opera macht davon "S%C3%BCdhessen"

    Wenn UTF-8 als Default eingestellt ist.
    Wenn du ISO-8859-1 als Defaultcodierung einstellst, sendet er das auch: S%FCdhessen
    Die zusätzliche URL-Codierung (im Volksmund auch "percent encoding") muss natürlich sein.

    Firefox belässt es bei "Südhessen" (nein, wandelt auch um, aber zeigt korrigiert an, man merkt es, wenn man die URL mit ctrl-C übernimmt)

    Er verhält sich AFAIK genauso wie der Opera, nur dass er in der Adresszeile die URL-Codierung auflöst (im Hintergrund aber korrekt anwendet).

    In PHP übernehme ich das mit

    $suche = utf8_encode($_GET['suche']);

    echo $suche;

      
    Du betrachtest den String, den du bereits in UTF-8 bekommst, als ISO-Latin und codierst erneut nach UTF-8 um. Wozu? Die Verwendung von utf8\_encode ist, soweit ich erkennen kann, völlig unangebracht.  
      
    
    > echo-Anzeige: Südhessen  
      
    Das ist dann logisch.  
      
    
    > Da ich in der DB danach suche, gibt es kein Ergebnis. Was mache ich falsch?  
      
    Du rechnest Beträge in Dollar um, die schon in Dollar vorliegen. Sozusagen. ;-)  
      
    Ciao,  
     Martin  
    
    -- 
    Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.  
      (George Bernhard Shaw)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo Martin,

      Die Codierung deiner Seiten ist aber irrelevant, wenn du von Hand etwas direkt in die Adresszeile eingibst. Da fehlt jegliche Angabe der Codierung. Der Browser wird also das verwenden, was für ihn als Default eingestellt ist.

      Verständnisproblem. Es ist also abhängig von der Browser-Einstellung des Lesers, wie Umlaute codiert werden? Bei mir: Automatische Auswahl - was ist das?

      Also kommt es mal so, mal so und dann wieder ganz anders rein? Wie kann ich damit umgehen?

      Gast

      1. Hallo,

        Also kommt es mal so, mal so und dann wieder ganz anders rein? Wie kann ich damit umgehen?

        Musst du denn damit umgehen? Die Benutzer deiner Seite werden wohl kaum ihre Parameter per Hand in die Adresszeile eingeben. Da hast du ja nur zu Testzwecken gemacht, oder?

        Ich würde an der Stelle fragen: Wird überhaupt UTF-8 ausgeliefert?

        Viele Grüße
        Siri

      2. Om nah hoo pez nyeetz, Gast!

        Die Anzeige in der Adresszeile ist bei neueren Browsern völlig uninteressant. Sie wollen das für den Menschen nett darstellen. Das merkst du zum Beispiel daran, wenn du etwa eine Adresse eines wikipedia-Artikels aus der Adresszeile kopierst und in ein Textdokument einfügst. Die Url-codierung wird decodiert.

        Du wirst ja deine Suchergebnisse nicht über die Adresszeile holen, sondern über ein Formular, was die Parameter sendet.

        Archivbeitrag: http://forum.de.selfhtml.org/archiv/2008/4/t169838/

        Matthias

        --
        1/z ist kein Blatt Papier.

      3. Hallo,

        Die Codierung deiner Seiten ist aber irrelevant, wenn du von Hand etwas direkt in die Adresszeile eingibst. Da fehlt jegliche Angabe der Codierung. Der Browser wird also das verwenden, was für ihn als Default eingestellt ist.
        Verständnisproblem. Es ist also abhängig von der Browser-Einstellung des Lesers, wie Umlaute codiert werden?

        ja, aber nur bei direkter URL-Eingabe von Hand. Sobald der Request aus einem bestehenden Dokument heraus erzeugt wird (Link, Formularversand, AJAX), wird die Codierung des Dokuments verwendet.

        Bei mir: Automatische Auswahl - was ist das?

        Das betrifft nur die Codierung von Daten, die der Browser vom Server bekommt. Da soll er ruhig die Codierung anwenden, die ihm mitgeteilt wird; falls jegleicher Hinweis fehlt, darf er raten. Insofern ist "Automatisch" vermutlich das beste, was man hier einstellen kann.

        Die Default-Codierung für gesendete Daten steckt viel tiefer in der Browserkonfiguration; ich wüsste so auf die Schnelle nicht einmal, wo ich die bei meinen Browsern finde.

        Also kommt es mal so, mal so und dann wieder ganz anders rein? Wie kann ich damit umgehen?

        Normalerweise gar nicht. Oder sind von Hand eingegebene URLs für dich ein wichtiges Thema?

        Ciao,
         Martin

        --
        Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.
          (George Bernhard Shaw)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Tach!

          Die Default-Codierung für gesendete Daten steckt viel tiefer in der Browserkonfiguration; ich wüsste so auf die Schnelle nicht einmal, wo ich die bei meinen Browsern finde.

          Zum Beispiel Firefox network.standard-url.encode-utf8.
          Wenn ich mich recht erinnere, gab es zumindest früher mal zwei Optionen, mit denen man Path und Querystring unterschiedlich einstellen konnte.

          IE (9, aber auch schon früher an ähnlicher Position): Lasche Advanced, Abschnitt: International, Send UTF-8 URLs.

          dedlfix.

          1. Hallo,

            Die Default-Codierung für gesendete Daten steckt viel tiefer in der Browserkonfiguration; ich wüsste so auf die Schnelle nicht einmal, wo ich die bei meinen Browsern finde.

            Zum Beispiel Firefox network.standard-url.encode-utf8.
            Wenn ich mich recht erinnere, gab es zumindest früher mal zwei Optionen, mit denen man Path und Querystring unterschiedlich einstellen konnte.

            IE (9, aber auch schon früher an ähnlicher Position): Lasche Advanced, Abschnitt: International, Send UTF-8 URLs.

            Bingo, jetzt hab ich's im Opera auch gefunden:
             Tools/Preferences/Advanced, Kategorie Network
             [X] Encode international web addresses with UTF-8

            Ciao,
             Martin

            --
            Zwei Stammtischbrüder:
            Hier steht, dass laut Statistik über 60 Prozent aller Ehefrauen fremdgehen.
            Was soll ich mit dieser Information? Ich brauche Namen, Fotos, Telefonnummern ... !
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Tach!

    Ergänzend zum Martin:

    URL-Parameter mit Umlaut werden von verschiedenen Browsern verschieden umgesetzt und gesendet. Meine Seiten sind UTF-8 codiert.
    Eingabe in der Adresszeile:

    Gegen das, was der Browser beim händischen Eingeben macht, kann man von Serverseite aus nichts machen. Du kannst nur zu erkennen versuchen, ob du UTF-8 gesendet bekommst oder nicht. Theoretisch ist das nicht in jedem Fall zweifelsfrei möglich. (Eine gültige UTF-8-Sequenz könnte auch zwei (bis vier) einbytige Zeichen darstellen. Praktisch kommen solche Zeichenfolgen aber kaum unter "normalen" Umständen vor.) Und auch wenn es kein UTF-8 ist, kann es noch eine Vielzahl anderer Kodierungen sein, die man nicht allein anhand der Betrachtung der Zeichen-Codes auseinanderhalten kann. In der Praxis wirst du dich auf UTF-8 und ISO-8859-1 (und Windows-1252 => ISO-8859-1 plus ein paar weitere Zeichen) beschränken können. Es sei denn, du bedienst auch noch den Markt, der normalerweise eine andere ISO-8859-x-Kodierung oder was ganz anderes verwendet. Dann wird es unter Umständen unlösbar, wenn du nicht vor dem Dekodierversuch bereits festlegen kannst: "das ist Westeuropa" also wird es ISO-8859-1 sein, "das ist Mitteleuropa" => -2, "das ist Russisch, ..." => -5, etc.

    Es gibt diverse Funktionen in den Userkommentaren des PHP-Handbuch (z.B. unter utf_8en/decode) oder anderswo, die zumindest das Erkennen von UTF-8 versprechen. Alle Funktionen können höchstens aussagen: "ja, das ist ein Text ohne ungültige UTF-8-Sequenzen", was für praktische Belange als "ja, das ist UTF-8" angesehen werden kann. Von diesen Funktionen gibt es (mindestens) zwei Arten. Die einfachen kodieren einmal nach ISO-8859-1 und wieder zurück nach UTF-8 um. Wenn das Ergebnis gleich ist, dann ist es kein ungültiges UTF-8 (sprich: ist vermutlich UTF-8). Diese Methode hat aber den Nachteil, dass dabei auch Texte als ungültig verworfen werden, die Zeichen außerhalb des ISO-8859-1-Bereichs enthalten. Allerdings ist diese Methode sehr schnell. Die langsame Art ist, den Text Byte für Byte durchzugehen und bei Werten oberhalb von x7F auf gültige UTF-8-Sequenzen zu prüfen. Das Ergebnis ist wie bei der anderen Art zu interpretieren.

    Da ich in der DB danach suche, gibt es kein Ergebnis. Was mache ich falsch?

    Von und zur DB ist aber alles richtig, sprich: mysql(i)_set_charset() oder SET NAMES oder ein Äquivalent verwendest du einerseits, die Kodierung der einzelnen String-Felder andererseits stimmt auch?

    dedlfix.