Ölapalöma: Verwandlung in Umlaute bei der Eingabe der URL

Hallo!
Ich bastel gerade eine Volltextsuche und habe das Problem das noch keine Umlaute verglichen werden. Entweder weil die HTML-Dateien eine andere Codierung haben als der search-String oder weil der Fehler schon weit vorher beginnt und so frage ich mich warum ich gerade bei diesem "Projekt" das Problem habe, dass er aus jeder URL-Eingabe a la test.php?var=öäü > test.php?var=%F6%E4%FC macht!? Bei anderen Projekten ist das nicht so..

Die Datei ist so aufgebaut:
<? header('Content-type: text/html; charset=utf-8'); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
<?
...

Danke!
Ölapalöma

  1. Hallo!

    Ich bastel gerade eine Volltextsuche und habe das Problem das noch keine Umlaute verglichen werden. Entweder weil die HTML-Dateien eine andere Codierung haben als der search-String oder weil der Fehler schon weit vorher beginnt ...

    Genau das solltest Du breinigen.

    und so frage ich mich warum ich gerade bei diesem "Projekt" das Problem habe, dass er aus jeder URL-Eingabe a la test.php?var=öäü > test.php?var=%F6%E4%FC macht!?

    Das macht der UserAgent (Browser)

    bei anderen Projekten ist das nicht so..

    da machts jemand anderes, aber vermutlich nicht richtig.

    Dein Anliegen hat mit URI-Encoding (früher auch als Encode URI bezeichnet) nichts oder nur wenig zu tun. URI-Encoding ist für die Übertragung mit HTTP zuständig. Deine Problem ist mit einer konsistenten Zeichenkodierung lösbar.

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Dein Anliegen hat mit URI-Encoding (früher auch als Encode URI bezeichnet) nichts oder nur wenig zu tun. URI-Encoding ist für die Übertragung mit HTTP zuständig. Deine Problem ist mit einer konsistenten Zeichenkodierung lösbar.

      Ne das mache ich ja schon:
      $search = utf8_encode($_GET["search"]);

      aber mir gefällt das schon nicht das er die URL umwandlet. Bei anderen Projekten bleiben die Zeichen so stehen wie ich sie eingebe.. Und View>Character Encoding steht immer auf UTF-8 oder auf Auto

      also die Variable wird schon richtig übergeben, aber die URL nervt mich ein wenig.. Ich bin der Lösung keines wegs auf der Spur...

      Ölapalöma

      1. Leute ich hab echt keinen PLan mehr!

        Bitte helfen!

        Ölapalöma

        1. Mein code...

          <?  
          $opts = array(  
            'http'=>array(  
              'method'=>"GET",  
              'header'=>"Accept-language: en\r\n" .  
                        "Cookie: foo=bar\r\n" .  
                        "Content-type: text/html" .  
                        "charset=utf-8"  
            )  
          );  
          $context = stream_context_create($opts);  
          ?>  
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
          <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">  
            
          <?  
          set_time_limit(2);  
            
          $path = "./";  
          $search = utf8_encode($_GET["search"]);  
          $highlight = "<DIV STYLE=\"background-color: darkblue; color: white; display: inline;\">".$search."</div>";  
            
          $dir=opendir($path);  
          while ($file = readdir ($dir))  
          if (!is_dir($datei))  
          {  
          	if ($file != '.' && $file != '..')  
          	{  
          		if (eregi(".htm", $file)){  
            
          		echo "<b>".$file."</b><br>";  
            
          		$content =  strip_tags(file_get_contents($file));  
            
          		echo "<div STYLE=\"font-size: 10px;\">".$content."</div>";  
          		echo "<br><br>";  
          		$offset = 0;  
          		$pos = 0;  
          		$text_range = 100;  
            
          		echo $search."<br>";  
          		if(eregi($search,$content)) print "MATCH!<br><br>"; # Kontroll-Abfrage  
            
          		do{  
          			$pos = strpos($content,$search,$offset);  
            
          			if ($pos !== false){  
          			$text_s = $pos-$text_range;  
          			$text_e = $text_range*2;  
          			if ($text_s<0)$text_s=0;  
          			echo "S:".$text_s;  
          			echo "-E:".$text_e;  
          			echo "<br>";  
          			echo "<b>".str_replace($search,$highlight,substr($content,$text_s,$text_e))."</b>";  
          			#$re[$file][] = str_replace($search,$highlight,$substr);  
          			$offset = $pos+$text_e;  
          			}  
          			else print "<i>no match</i>";  
            
          		echo "<br><br>";  
            
          		} while($pos !== false);  
            
          		echo "<hr>";  
          		}  
            
          	}  
          }  
          ?>
          
        2. Leute ich hab echt keinen PLan mehr!

          Die Frage ist, warum wird die URL umgeandelt?

          Struppi.

      2. hi,

        guckt Dir mal Struppies Antwort an.

        aber mir gefällt das schon nicht das er die URL umwandlet. Bei anderen Projekten bleiben die Zeichen so stehen wie ich sie eingebe.. Und View>Character Encoding steht immer auf UTF-8 oder auf Auto

        Haken wir mal hier ein, zum besseren Verständnis, Soll:

        [a] hast ein Suchformular was utf-8-kodiert im Browser steht, gibst ein 'ü' ein und schickst ab. Im URI steht '%C3%BC'.

        [b] hast ein Suchformular was iso-8859-1-kodiert im Browser steht, gibst ein 'ü' ein und schickst ab. Im URI steht '%FC'.

        Du möchstest wahrscheinlich [a]. Um das erstmal hinzukriegen, sollte der Webserver dem HTTP-Header ein

        charset=UTF-8

        mitgeben. Wenn Du das hast, melde Dich wieder.

        Hotte

        --
        format c:
        1. Ich habe kein Formular - ich gebe es direkt ein.

          Und Erreiche ich das nicht über die Methoden die ich bereits anwende??
          Also ich meine die Antwort ist ja klar, aber ich dachte das das ausreichen sollte.. ständig ist was anderes mann...

          Wie gehtn das?? :-)

          1. Wie gehtn das?? :-)

            in dem du es richtig machst.

            Struppi.

          2. Hi!

            Ich habe kein Formular - ich gebe es direkt ein.

            Wie soll der Browser dann wissen, welche Kodierung er verwenden soll? Genau, er nimmt die, die er voreingestellt hat. Wenn du also ISO-8859-1-Zeichen bekommst aber UTF-8 haben möchtest, dann musst du deinen Browser umkonfigurieren.

            Und Erreiche ich das nicht über die Methoden die ich bereits anwende??

            Bei Handeingabe wirken nur die "Methoden" des Browsers.

            Also ich meine die Antwort ist ja klar, aber ich dachte das das ausreichen sollte.. ständig ist was anderes mann...

            Quengeln hilft nicht, davon lässt sich kein Computer beeindrucken. Eine Do-what-I-mean-Funktion gibt es übrigens auch nicht.

            Lo!

          3. hi,

            Ich habe kein Formular - ich gebe es direkt ein.

            Interessant. Also ich hab jetzt maln paar Tests gemacht, hatte sowohl Seiten mit utf-8 also auch welche mit iso-8859-1 Kodierung unter der Adressleiste, aber wenn ich da ein 'ü' eingebe, wirds immer zu 'FC' im Mozilla.

            IE mit about:blank leitet mich zu http://www.bing.com/search?srch=105&FORM=AS5&q=%c3%bc um, da wirds 'ü' also zu '%C3%BC' was ein URI-encodedetes utf-8 'ü' ist.

            Und Erreiche ich das nicht über die Methoden die ich bereits anwende??

            Die Adresszeile ist was für Hacker. Deine Besucher möchten vermutlich ein Formular mit klaren Verhältnissen was die Zeichenkodierung betrifft. Und Du bekommst damit serverseitig auch Zeichen, die eine definierte Kodierung haben.

            Hotti

            --
            Komisch. Die meisten Seiten, die mit PHP geschrieben sind, haben Kodierungsfehler.
            1. Hi,

              Interessant. Also ich hab jetzt maln paar Tests gemacht, hatte sowohl Seiten mit utf-8 also auch welche mit iso-8859-1 Kodierung unter der Adressleiste, aber wenn ich da ein 'ü' eingebe, wirds immer zu 'FC' im Mozilla.

              Wenn du die Adresszeile zur Eingabe benutzt, dann interessiert es den Browser nicht, in welcher Kodierung ein zufällig gerade angezeigtes Dokument vorliegt.

              IE mit about:blank leitet mich zu http://www.bing.com/search?srch=105&FORM=AS5&q=%c3%bc um, da wirds 'ü' also zu '%C3%BC' was ein URI-encodedetes utf-8 'ü' ist.

              Im IE kann man in den Internet-Optionen explizit einstellen, ob URLs UTF8-kodiert versandt werden sollen.

              Im Firefox gibt es unter about:config die folgenden Optionen
              network.standard-url.encode-query-utf8 - false
              network.standard-url.encode-utf8       - true
              network.standard-url.escape-utf8       - true
              die diesbezüglich interessant sein dürften. (Angegeben jeweils der Defaultwert.)

              Wenn ich die erste davon auf false lasse, wandelt er eine eingegebene Query ?test=ü in ?test=%FC um; setze ich sie auf true, lässt er ?test=ü in der Adresszeile stehen.
              Gebe ich den Wert in einem UTF-8 kodierten Testdokument aus, gibt er mir im ersten Fall ein nicht darstellbares Zeichen an, um zweiten stellt er korrekt das ü dar.

              MfG ChrisB

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

                Im IE [..] und im Firefoxx gibt es unter about:config [..]

                Wow, danke für die Infos!!

                Sch%C3%B6ne+Gr%C3%BC%C3%9Fe,
                Hotte

                --
                1. OKOK ich bin schon fast am Ziel..

                  Ich habe nun nur noch das Problem, dass die HTML dateien die durchsucht werden sollen keine klare Zeichenkodierung gesetzt bekommen haben (<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">), da Sie im Projekt selbst immer nur Inkludiert werden.

                  Ich habe folgendes probiert:

                  Variante A)
                  $content = utf8_encode(htmlspecialchars(strip_tags(file_get_contents($file))));

                  Das führt aber dazu, dass Exclusive Sonderzeichen wie zB das "•"-Zeichen wieder verkorkzt werden zu [Kann ich nicht Posten („discouraged character“), ein Viereck mit zwei nullen oben und einer 95 unten]. öäü Funktioniert - Warum ist das so?

                  Variante B)
                  $content = htmlspecialchars(strip_tags(file_get_contents($file)));

                  So bekomme ich gar keine Sonderzeichen angezeigt (also weder noch)

                  Versuch)

                  $charset = '<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">';  
                  $content =  $charset.htmlspecialchars(strip_tags(file_get_contents($file)));
                  

                  Ich dachte: Da Variante B funktioniert wenn die Zeichenkodierung im Dokument gesetzt wurde, dann könnte das vll auch klappen :-) Aber das ergebnis ist das selbe wie bei Variante B

                  Frage)
                  Warum zickt file-get-contents() in meinem Fall eigentlich so rum?
                  Ich nutze EasyEclipse for PHP und habe alles auf UTF-8 gesetzt sowohl im Projekt selbst als auch im Dokument via
                  <?php header("Content-Type: text/html; charset=UTF-8"); ?>

                  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
                  <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
                  

                  Also wie kann ich das noch lösen?

                  Danke
                  Ölapalöma

                  1. Variante A)
                    $content = utf8_encode(htmlspecialchars(strip_tags(file_get_contents($file))));

                    Das ist Unsinn.

                    Auch wenn du mit mir nicht reden willst und meine Fragen nicht beantworten willst, könntest du dir aber trotzdem den folgenden Artikel durchlesen, weil dieser sich genau von deinem Problem handelt

                    http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

                    Struppi.

                  2. hi,

                    Also wie kann ich das noch lösen?

                    Trenne Dich von allen möglichen und unmöglichen "Konvertierungsfunktionen" von utf-8 nach sonstwohin und zurück und schreibe Deinen HTML-Quellenkode mit einem Editor der utf-8 unterstützt. Dann sollte Dein Webserver in den HTTP-Header ein

                    charset=utf-8

                    setzen, wie ich schon schrieb und Du schreibst in die HTML-Header ein

                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

                    und die Ümläute, die Du mit PHP auf STDOUT schickst, sind selbstverständlich auch utf-8 kodiert, weil Du Deine Scripts mit dem selben Editor und derselben Zeichenkodierung schreiben solltest, wie die HTML-Dateien.

                    Dann hat Deine Frickelei ein Ende und Deine Besucher können ein Rezept für Borschtsch auch in kyrillischer Schrift (Кириллица) in Dein Gästebuch schreiben.

                    Hotte

                    --
                    #!?
  2. Ich bastel gerade eine Volltextsuche und habe das Problem [....] dass er aus jeder URL-Eingabe a la test.php?var=öäü > test.php?var=%F6%E4%FC macht!? Bei anderen Projekten ist das nicht so..

    Die URL zeigt ISO kodierte Zeichen, weiter unten behauptest du dein HTML Code ist in utf-8 kodiert. Da liegt wohl ein Problem vor

    Struppi.