Kalle_B: Umlaut der URL wird nicht erkannt

Hallöle,

in die Adresszeile der Opera habe ich einen Parameter &ORT=bad dürkheim also mit Umlaut.

Nachdem ich das abgeschickt habe, erscheint der Parameter in der Adresszeile so: &ORT=bad%20d%FCrkheim demnach ist %FC das ü.

Auf der HTML-Seite (UTF-8 codiert) sieht die Ausgabe so aus:
bad d�rkheim

Aha, dachte ich, du musst den GET- Parameter noch nach UTF-8 wandeln:
mb_convert_encoding ( trim( $_GET['ORT'] ), 'UTF-8', 'auto' )

Nun wird aber das ü verschluckt:
bad drkheim

Der Ort wird in beiden Fällen natürlich in der Datenbank nicht gefunden.

Ich muss Umlaute erkennen, damit Orte verlinkt werden. Was habe ich falsch gemacht oder nicht bedacht?

Lieben Gruß, Kalle

  1. auch mein Freund urldecode hilft mir nicht weiter:
    mb_convert_encoding ( urldecode( trim( $_GET['ORT'] )), 'UTF-8', 'auto' )

  2. Hallöle,

    in die Adresszeile der Opera habe ich einen Parameter &ORT=bad dürkheim also mit Umlaut.

    Nachdem ich das abgeschickt habe, erscheint der Parameter in der Adresszeile so: &ORT=bad%20d%FCrkheim demnach ist %FC das ü.

    Auf der HTML-Seite (UTF-8 codiert) sieht die Ausgabe so aus:
    bad d�rkheim

    Aha, dachte ich, du musst den GET- Parameter noch nach UTF-8 wandeln:
    mb_convert_encoding ( trim( $_GET['ORT'] ), 'UTF-8', 'auto' )

    Nun wird aber das ü verschluckt:
    bad drkheim

    Der Ort wird in beiden Fällen natürlich in der Datenbank nicht gefunden.

    das Problem hatte ich auch gerade - siehe http://forum.de.selfhtml.org/archiv/2009/10/t191630/

    Schlussfolgerung für mich daraus:
    Ich prüfe einen evt. vorhandenen Query-String darauf, ob er UTF-8 valide ist. Wenn ja, verarbeite ich ihn weiter, wenn nein, ignoriere ich ihn.

    Da dieses Problem AFAIK überwiegend bei einigen Browsern auf Windows Systemen auftaucht, könntest du "auf Verdacht" auch mal davon ausgehen, dass der Query-String womöglich CP1252 kodiert ist, ihn entsprechend umwandeln und gucken, ob es dann eine Übereinstimmung gibt.

    Das Problem sollte entfallen, wenn der Query-String über ein Formular oder einen Link von einer entsprechend UTF-8 kodierten Seite kommt. Dann ist auch der Query-String vollständig UTF-8 kodiert.

    Gruß Gunther

    1. Hallöle Gunther,

      Da dieses Problem AFAIK überwiegend bei einigen Browsern auf Windows Systemen auftaucht, könntest du "auf Verdacht" auch mal davon ausgehen, dass der Query-String womöglich CP1252 kodiert ist, ihn entsprechend umwandeln und gucken, ob es dann eine Übereinstimmung gibt.

      Au ja, das funzt zunächst:
      mb_convert_encoding( trim( $_GET['ORT'] ), 'UTF-8', 'CP1252' )

      Hoffentlich nicht nur zufällig im Betriebssystem Win200 mit Opera Version 9.64 (Linux-Laptop mit FF anschmeiss ... und nein, hier schon wieder nicht. Das ü wird als à 1/4 dargestellt.

      Das Problem sollte entfallen, wenn der Query-String über ein Formular oder einen Link von einer entsprechend UTF-8 kodierten Seite kommt. Dann ist auch der Query-String vollständig UTF-8 kodiert.

      Ja, wenn er ins Formular eingegeben wird. Ich möchte aber in Mails auf Bad Dürkheim verlinken. Okay, ich nehme die Postleitzahl, die hat erfreulicherweise keine Umlaute ...

      Gruß, Kalle

      1. Hallöle Kalle,

        Ja, wenn er ins Formular eingegeben wird. Ich möchte aber in Mails auf Bad Dürkheim verlinken. Okay, ich nehme die Postleitzahl, die hat erfreulicherweise keine Umlaute ...

        warum?
        Dann mach' es doch so, dass auch "Bad Duerkheim" 'erkannt' wird (und dann auf "Bad Dürkheim" weiterleitet) und verwende in den Mails dann eben diese Links.

        Gruß Gunther

        1. Hallöle Gunther,

          Dann mach' es doch so, dass auch "Bad Duerkheim" 'erkannt' wird (und dann auf "Bad Dürkheim" weiterleitet) und verwende in den Mails dann eben diese Links.

          Hmmm ... Wenn ich mit "bad durkheim" suche, gibt's den richtigen Treffer. Ich suche in der Datenbank mit LIKE, da sind U, u, Ü, ü wohl gleichwertig, aber nicht ue.

          Der Ortsname ist in der DB utf8_unicode_ci codiert.

          Ich denke, es ist nicht richtig, _irgendeinen_ Ort zu finden, der gesuchte sollte es schon sein. Wenn ich nun auch noch UE, Ue, ue, uE mit den vier vorigen Varianten gleich mache ...

          Und dann geht das Spielchen ja mit Ä, Ö, ß und Deutschlands Nachbarn weiter, die auch Nicht-ASCII-Zeichen haben.

          Okay, nur nach erfolgloser Suche im zweiten Durchgang. Behagt mir aber irgendwie nicht, muss ich nochmal drüber schlafen.

          Kalle

          1. Und dann geht das Spielchen ja mit Ä, Ö, ß und Deutschlands Nachbarn weiter, die auch Nicht-ASCII-Zeichen haben.

            Basel, Bâle, Basilea

            Mir scheint, du nutzt das effektivste Feld deiner DB nicht. Jeder Eintrag hat ja schliesslich eine ID.

            http://exaple.org/search?loc=5757485#_Basel_Bâle_Baslilea

            Dass das Fragment nicht mitgesendet wird, kann dir ja egal sein. Es dient in diesem Fall als Label für die Url.

            mfg Beat

            --
            ><o(((°>           ><o(((°>
               <°)))o><                     ><o(((°>o
            Der Valigator leibt diese Fische
      2. Hi!

        Okay, ich nehme die Postleitzahl, die hat erfreulicherweise keine Umlaute ...

        Die ist aber unter Umständen zu ungenau. Es gibt Orte mit mehreren Postleitzahlen und es gibt Postleitzahlen, die mehreren Orten zugewiesen sind. Das solltest du bei einem eventuellen Verwenden dieses Workarounds beachten.

        Lo!

      3. Hi,

        Das Problem sollte entfallen, wenn der Query-String über ein Formular oder einen Link von einer entsprechend UTF-8 kodierten Seite kommt. Dann ist auch der Query-String vollständig UTF-8 kodiert.

        Ja, wenn er ins Formular eingegeben wird. Ich möchte aber in Mails auf Bad Dürkheim verlinken.

        In welcher Zeichenkodierung verschickst du diese Mails, und wie hast du den Link darin notiert?

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
  3. Hi,

    Nachdem ich das abgeschickt habe, erscheint der Parameter in der Adresszeile so: &ORT=bad%20d%FCrkheim demnach ist %FC das ü.

    ü in UTF-8 url-kodiert wäre %C3%BC.

    Auf der HTML-Seite (UTF-8 codiert) sieht die Ausgabe so aus:
    bad d�rkheim

    Nachvollziehbar, dieser Inhalt liegt ja auch nicht in UTF-8 vor.

    Aha, dachte ich, du musst den GET- Parameter noch nach UTF-8 wandeln:
    mb_convert_encoding ( trim( $_GET['ORT'] ), 'UTF-8', 'auto' )

    Nun wird aber das ü verschluckt:
    bad drkheim

    Wie sieht denn die Konfiguration der mbstring-Funktionen aus?

    Ich muss Umlaute erkennen, damit Orte verlinkt werden. Was habe ich falsch gemacht oder nicht bedacht?

    Wenn du die Links ausgegeben hast, aus denen diese Abfragen resultieren - dann hast du vergessen, sie selber URL-gerecht zu kodieren, und zwar in der Zeichenkodierung, in der sie bei dir vorliegen; und hast die URL-Kodierung dem Client überlassen, der aber von einer anderen Zeichenkodierung ausging.

    Wenn die Abfragen von anderswo kommen, dann kannst du da auf trivialem Wege nicht viel gegen machen - es sind einfach Requests nach Daten, die bei dir unter dieser Adresse nicht existieren.

    Mehr Aufwand kann man natürlich betreiben, wenn man möchte - wie Gunther schon andeutete, Kodierung des angefragten Identifiers auf UTF-8 zu "prüfen" versuchen, und wenn das erfolglos ist, dann eine andere Kodierung zu "raten", und unter Verwendung dieser nachzuschauen, ob man in seinem Datenbestand was findet.
    Ob dieser Aufwand es wert ist, kommt darauf an, wie sehr das konkrete Projekt es sich leisten kann/will, Anfragen auf verpfuschte Requests (durch wessen Schuld* auch immer) mit einem leicht vor den Kopf stossenden 404 zu beantworten.

    MfG ChrisB

    * Ausser eigener, die wäre kaum entschuldbar, siehe oben.

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
  4. Hello,

    in die Adresszeile der Opera habe ich einen Parameter &ORT=bad dürkheim also mit Umlaut.

    Wie kommt die Einganbe denn dorthin?

    Nachdem ich das abgeschickt habe, erscheint der Parameter in der Adresszeile so: &ORT=bad%20d%FCrkheim demnach ist %FC das ü.

    Wie hast Du das abgeschickt?
    Bzw. was wird im Browser angezeigt, wenn Du "abschickst", wie ist die HTML-Source codiert?

    Auf der HTML-Seite (UTF-8 codiert) sieht die Ausgabe so aus:
    bad d�rkheim

    Ist das schon die Response?
    Mit welcher Codierung arbeitet der Server?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      in die Adresszeile der Opera habe ich einen Parameter &ORT=bad dürkheim also mit Umlaut.

      Wie kommt die Einganbe denn dorthin?

      Habe in einer Mail den Link getippt und - vorsichtshalber vor dem Abschicken - per Copy und Paste in die Adresszeile gebracht. Aber das direkte Eintippen wirkt genauso.

      Nachdem ich das abgeschickt habe, erscheint der Parameter in der Adresszeile so: &ORT=bad%20d%FCrkheim demnach ist %FC das ü.

      Wie hast Du das abgeschickt?

      Eingabetaste gedrückt.

      Bzw. was wird im Browser angezeigt, wenn Du "abschickst", wie ist die HTML-Source codiert?
      Mit welcher Codierung arbeitet der Server?

      mb_internal_encoding('UTF-8');
      @mysql_query( "SET NAMES 'utf8'", $conn_id );
      //header('content-type: text/html; charset=utf-8'); // hinter cookies
      ...
      echo $_GET['ORT'];

      Wird im HTML- Formular genauso "falsch" angezeigt, auch nachdem der header geschickt wurde.

      Ich denke Chris hat Recht:
      "und hast die URL-Kodierung dem Client überlassen, der aber von einer anderen Zeichenkodierung ausging ... Wenn die Abfragen von anderswo kommen, dann kannst du da auf trivialem Wege nicht viel gegen machen ..."

      Schade, dass man Orte mit Umlauten nicht mit ihrem Ortsnamen verlinken kann. Da muss ich halt die PLZ oder ort_id nehmen, ist aber in Mails nicht so anschaulich, der gewünschte "Aha - so einfach - Effekt" entfällt.

      Lieben Gruß, Kalle