PHP Problem mit Umlauten aus GET-Parameter

M

Mr. Snoot

Gast
Hü,

ich habe - mal wieder :D - Probleme mit Umlauten; diesmal aber sehr kurios.

Wenn man auf meiner Seite nach Waferoberfläche sucht und den zweiten Treffer aufruft (Lexikon Läppen), dann sollte auf der Seite der Suchbegriff (Waferoberfläche) markiert werden. Dazu wird er von der Suchergebnisseite aus im Link als Get-Parameter übergeben.

Wenn man nun von den Suchergebnissen aus die Seite aufruft, dann wird der Treffer nicht markiert. Auch nicht, wenn man die Seite mit F5 aktualisiert. Bestätigt man aber nochmal händisch mit Enter die URL in der Adressleiste, dann klappt es und der Treffer wird markiert.


Wie kann das denn sein?


Es betrifft nur Trefferseiten, die aus der Datenbank kommen (alles, was Lexikon: X ist). Dort sind sie mit latin1_german2_ci kodiert, die Ausgabe im Browser wird nochmal bearbeitet: mysql_query("SET NAMES 'utf8'")
Alle PHP-Scripte sind als UTF-8 gespeichert.


edit: mit header ("Content-Type: text/html;charset=utf-8"); zu Beginn scheint es zu klappen. Komischerweise werden jetzt vereinzelt(!?) Umlaute direkt in den Suchergebnissen nicht mehr richtig dargestellt

umlaute.png

Da soll noch einer durchblicken.
 
Zuletzt bearbeitet:
Das Charset sollte man generell immer im HTTP Header (also mit der Funktion header()) setzen.


Ohne den PHP Code zu kennen ist es hier schwer irgendetwas herauszufinden.


Was mir auffällt ist, das eigentlich immer nur der erste und letzte Umlaut davon betroffen sind. Deswegen wäre es interessant, den Code, der für das zusammenfassen/abschneiden des Artikels zuständig ist zu sehen.

Möglicherweise benutzt du eine nicht utf-8 kompatible Funktion.
 
Ja, das hab ich auch festgestellt. Wüsste aber nicht, was dabei das Problem sein könnte.

Hab mal das Script angehängt, die Ausgabe ist in Zeile 460:
PHP:
459 // Punkte hinzufügen, wenn mehr Zeichen als Max vorhanden sind
460   if ($strlen>$swlen) { $hit[0] = " ... ".$hit[0]." ... "; }
461   $hitx .= $hit[0];
Und wo ich mir das gerade anschaue, werden Wörter am Anfang und am Ende (also bei ... Text ...) eigentlich niemals abgeschnitten, sondern nur falls dort ein Umlaut ist.


Ich finde im Moment aber auch nur zwei Probleme wenn man nach Waferoberfläche sucht. Evtl. steckt da der Fehler woanders (der im Bild und knapp darunter noch einer).
 

Anhänge

Zuletzt bearbeitet:
ersetze mal strlen durch mb_strlen, mit korrekt gesetztem Charset.


Zeile 440/441:

PHP:
$swlen = mb_strlen($search_word, 'utf-8');
$strlen = mb_strlen($a, 'utf-8');
 
Ich werde aus dem Code nicht wirklich schlau (den eigenen Code zu lesen ist immer leichter :) ).

Kannst du das Problem isolieren (weniger Code, ohne Datenfile), damit ich das Problem bei mir reproduzieren kann?
 
Naja, 99 % von dem Script hab ich leider auch nicht geschrieben :D

Was bräuchtest du denn?

Das Datenfile ist jedenfalls so aufgebaut:
Code:
/Pfad_zurSeite/||Angezeigter Titel in den Suchergebnissen| | |Kompletter Text dieser Seite
Also bspw.:
Code:
/lexikon/T/Target/||Lexikon: Target| | |Das Target besteht aus dem Material, dass beim Sputtern auf dem Wafer als Schicht erzeugt werden soll.
Meist ist das Target mit der Kathode gekoppelt (negative Elektrode), so dass positive Ionen (meist Argonionen) darauf hin 
beschleunigt werden, um dort das Material herauszuschlagen, welches sich dann auf dem Wafer absetzt. Das Target besteht
meist aus einem leitenden Material, damit die Ladung der Ionen abgeführt werden kann.
(das ist also nicht der Text, der mir in den Suchergebnissen angezeigt wird, sondern der komplette Text, aus dem dann 500 Zeichen oder so ausgegeben werden)


Ist aber vielleicht zu aufwendig für dich. Auch wenn ich da Perkeftionist bin, und mich das schon stört.


Liegts vielleicht daran, dass im Scripts Sonderzeichen kodiert werden?
PHP:
// Entities verarbeiten
494 function ch_uml($del_uml)
495 {
496	if(function_exists('html_entity_decode')){
497 		$del_uml = html_entity_decode($del_uml);
498 	}
499 	else {
500 		$del_uml = str_replace('ä', 'ä', $del_uml); // Umlaute und ß
501 		$del_uml = str_replace('ö', 'ö', $del_uml);
502 		$del_uml = str_replace('ü', 'ü', $del_uml);
503 		$del_uml = str_replace('Ä', 'Ä', $del_uml);
504 		$del_uml = str_replace('Ö', 'Ö', $del_uml);
505 		$del_uml = str_replace('Ü', 'Ü', $del_uml);
506 		$del_uml = str_replace('ß', 'ß', $del_uml);
507 	}
508      return ($del_uml);
509 } // end func
Dass da also was mit dem &-Zeichen nicht klappt?
 
Zuletzt bearbeitet:
Sorry, aber der Code ist die Hölle.


Bei jedem Suchvorgang wird dein (wahrscheinlich riesiges) Textfile eingelesen und per regexp komplett durchsucht.

Das ist nicht nur Performance- und load-technisch ein Alptraum, der Code lasst sich auch kaum warten (über 600 Zeilen Herumgepfusche mit Strings für eine simple Suchfunktion).


Irgendwo darin wird eine der vielen nicht utf-8 kompatiblem Funktionen deine Umlaute zerstören, aber wo kann ich nicht sagen, die 600 Zeilen ziehe ich mir nicht rein, sorry.


Du solltest alles in eine Datenbank einpflegen, dann kannst du eine ordentlich Suchfunktion erstellen.
 
Nä danke, das läuft wunderbar so - und was ich da noch wochenlang mit Korrekturvorschlägen und Suggest inkl. Korrektur dran rumgebastelt habe, da steig ich nicht um :D

Außerdem läufts reibungslos und auch flott.


Naja mal sehen - vielleicht hab ich am WE Zeit dem mal nachzugehen.

Danke trotzdem.

P.S. das Datenfile ist 220 KB groß und wird nicht mehr sonderlich wachsen.
 
Zuletzt bearbeitet:
Hallo nochmal.... ich glaube ich habe dein problem nicht ordentlich verstanden, kannsts mir nochmal erklären? vl weiß ich wat :D


edit: gerade gesehen, umlaute in der url sind nie gut...

mach einfach:

$suchbegriff = urlencode($dersuchbegriff);

$suchbegriff übergibst du dann anhand der url... und bei der seite, wo dann das gesuchte angezeigt wird also der artikel, machst du:

$suchbegriff = urldecode($_GET['suchbegriff']);

somit hast die umlaut probleme nicht in der url :)
 
Zuletzt bearbeitet: (was vergessen)
öhm, ok =)
ich guck mal :)

edit:

hab mir das mal angeschaut, öhm, warum ist deine suche 600(!!!) zeilen lang? oO
das bekommst mit 20-50 auch hin oO


aber in deinem script kenn ich mich auch nicht wirklich aus XD
 
Zuletzt bearbeitet:
Weil gute Scripte lang sind :p

Und solange mir niemand was kürzeres bietet, ist das das beste ;)




Was mir noch aufgefallen ist: eigentlich werden sämtliche Umlaute aller Seiten auch im Quellcode als Umlaute dargestellt. Nur bei den Suchergebnissen ist dies nicht der Fall. Hier werden Umlaute kodiert ausgegeben. Das betrifft nicht nur Umlaute, die in den Suchergebnissen stehen, sondern auch die, die von vornherein irgendwo in der search_result.php stehen.

Die Suchergebnisseite search_result.php wird über das o.g. Suchscript ausgegeben. Das ganze passiert so:
PHP:
164	$tmpl = join('', file('./tmpl/search_result.php'));
...

285	$file = fopen ("tmpl.php", "w+");
286	fwrite ($file, $tmpl);
287	fclose($file);
288	include("tmpl.php");
289	unlink("tmpl.php");
Vielleicht läuft hier etwas mit der Kodierung falsch? Kann man bspw. die Zeichenkodierung von tmpl.php beeinflussen?
 
Zuletzt bearbeitet:
ach lawer :D
ich zeig dir mal wie ich meine suche gemacht habe, für die mitgliederliste... =)

echo "<form method=\"post\" action=><div align=right>";
echo lang('search')." <input value=\"".$_REQUEST['search']."\" name=\"search\">";
echo " <input name=\"startSearch\" type=\"submit\" value=\"".lang('start_search')."\"></div></form>";

if($_POST['startSearch']) {
$res = $db->query("SELECT * FROM po_users WHERE `activ`='1' AND ".searchString($_POST['search'],'nickname')." OR ".searchString($_POST['search'],'forename')." OR ".searchString($_POST['search'],'surename')." ORDER BY type ASC, id ASC");
}
else {
$res = $db->query("SELECT * FROM po_users WHERE `activ`='1' ORDER BY type ASC, id ASC LIMIT $vars[jump],$vars[perPage]");
}

ist halt mit ner klasse, aber zu den eigentlichen funktionen die wichtig sind für dich:

function searchString($string,$field='testfeld',$onlyReport=false) {


$string = explode(" ",$string);

foreach($string as $val) {
$val = str_replace("+",' ',$val);
if($final) $final .= " OR ";
$final .= "`$field` LIKE '%$val%'";

if($normal) $normal .= ' ';
$normal.= $val;

if($report) $report .= ", ";
$report .= $val;

}

$final .= " OR `$field`='$normal'";


if(!$onlyReport) return $final;
else return $report;

}


if($res) {

foreach($res as $val) {

fullhighlight($_POST['search'],$val['nickname']);

}

}



function fullhighlight($what=false,$text=false) {

$w = explode(" ",$what);

$temp = $text;

foreach($w as $val) {

$temp = str_replace($val,"{%%%$&}$val{/%%%$&}",$temp);
}

$temp = str_replace('{%%%$&}','<span id=\'highlight\'><b><u>',$temp);
$temp = str_replace('{/%%%$&}','</u></b></span>',$temp);

return $temp;




}


Das ist viel einfacher ^^ hoffentlich hab ich nix wichtiges vergessen =))
ps: hier kannst du meine suche bewundern: www.projectone.darknight.dnsalias.com/members/

---


zum rest.... momento pls =)
----------------------
 
Zuletzt bearbeitet:
Ich weiß ja nicht, egal nach was ich suche - bspw. Wörter aus den News oder Termine -, das Ergebnis sieht so aus:

suche.jpg oder auch so suche2.jpg

Im IE sieht das Ergebnis außerdem unterschiedlich aus. Das hängt davon ab, ob ich die Eingabe mit Enter bestätige oder mit der Maus auf Suchen klicke.


Außerdem bietet meine Suche auch eine Korrektur bei falsch geschriebenen Wörtern und Wortvorschläge - inkl. Korrektur - während der Eingabe. Aber das soll ja jetzt kein Suchmaschinenbashing werden; wichtig ist zuerst mal mein Umlautproblem :D
 
Zurück
Oben