Seite 2 von 4

Verfasst: 17.11.2002 11:37
von Acid
hmm... bei mir auf´m Linux werden ä´s als ä´s in der search _Tabelle gespeichert, also Umlaute werden ned umgewandelt . hmm..

..wird wohl irgend´ne Serverkonfigurationsgeschichte sein.

Umlaute und scharfes ß

Verfasst: 21.11.2002 20:28
von Hermandl
Hi alle,

ich befasse mich erst seit 2 Tagen ein wenig mit diesem Problem, über das ich mich als simples Forumsmitglied im Thairing seit langem mehr gewundert als geärgert habe. Irgendeiner hat dann mal gemosert, und da habe ich dann eingehakt und bin auch ziemlich schnell auf das Umlautproblem gestoßen.

Folgendes hierzu:

1.) aus einer meiner früheren Erfahrungen ist es ein Problem der Datenbank, die in ANSI abspeichert, während man ASCII damit vergleicht (oder umgekehrt). Die Franzosen haben kein Problem mit ihren Akzenten, denn diese Zeichen sind in beiden Zeichensätzen meines Wissens an der gleichen Stelle, während die Umlaute an unterschiedlichen Stellen sitzen.

2.) Das gleiche trifft auch auf das scharfe ß zu.

3.) Es sind nicht nur die Deutschsprachigen betroffen, sondern auch z.B. Türken, Finnen und Ungarn. Also müsste wohl Interesse an der grundsätzlichen Behebung seitens des Entwicklerteams vorhanden sein. Insbesondere deshalb auch, weil die Behebung, nachdem man das nun weiss, nicht gerade sehr schwierig und ohne Nebenwirkungen in anderen Sprachen ist.

4.) Die Umwandlung der Umlaute und des scharfen ß in ae, ou, ue und ss ist nicht grundsätzlich verkehrt, sondern sogar die allgemeingültige Lösung. Nur: es muss an allen relevanten Stellen gemacht werden:

a) vor dem Abspeichern in die Suchwort-Liste (die Suchwörter usw.)

b) vor dem Vergleich (der Suchbegriff)

5.) weil in diesem Thread gefragt wurde, was Umlaute auf Englisch heißt: Theoretisch heißt es "vowal", aber zumindest die Amis sagen "umlauts" dazu.

Eine der Stellen, wo's ganz leicht geht, ist z.B. in include\functions_search.php, function clean_words.

Dort müsste der Array $drop_char_match um die Zeichen 'Ä','Ö','Ü','ä','ö','ü','ß' vergrößert werden und der Array $drop_char_replace um die Zeichen 'Ae','Oe','Ue','ae','oe','ue','ss'.

Die gleiche Änderung ist dort durchzuführen, wo diese Wörter separiert in die Datenbank gespeichert werden.

Jetzt braucht man noch ein Ex- und Hopp-Programm, das die bisherigen Forumseinträge neu durchkämmt (vorher aber die alten Wortlisten löschen, die werden nicht mehr gebraucht).

Dann werden wieder Äpfel mit Äpfeln und Birnen mit Birnen verglichen, egal ob in ASCII oder ANSI-Codierung.

Fertig.

Wenn das ein Benutzer der Software macht, gibt es halt ein Problem, wenn eine neue Version eingespielt wird. Deshalb würde ich schon darauf dringen, dass das längerfristig ins Produkt einfließt.

Ich würde es ja gerne mal probieren, aber es ist halt ein ziemlicher Umstand, den Apache-Server auf die Kiste zu holen (erfahrungsgemäß muss man evtl. sogar - warum auch immer - Perl installieren, wenn man php benutzt, und das alles klappt nie so ohne weiteres).

Wenn ich mal viel Zeit habe, versuche ich es. Oder hat einer der Leser zufällig schon die richtige Umgebung drauf?

Schöne Grüße
Hermann aus München

Verfasst: 21.11.2002 21:08
von Highfly
Hi Elo,

nur mal so als Kommentar zu Deinem YaBB Problem, wie wäre es dabei denn mit dem Glance Mod ??? Der zeigt Dir die letzten x (in der config eiinzustellen) geänderten Topics an.

Also dort wo gepostet wurde.

Verfasst: 21.11.2002 23:06
von Gast
Hi alle,

ich habe mir inzwischen den Code nochmals angesehen.

Ich denke, das ganze Problem ist unmittelbar lösbar, jedoch fehlt mir die nötige Umgebung zum schadenfreien Testen. Hat jemand von Euch die nötige Umgebung, dass er das ohne Gefahr ausprobieren könnte?

Folgendes Vorgehen:

In der Datei include\functions_search.php steht etwa in Zeile 24 - 25 folgender Code:

static $drop_char_match = array('^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!');
static $drop_char_replace = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', '', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' , ' ', ' ', ' ', ' ', ' ', ' ');

Das müsste überschrieben werden durch:
static $drop_char_match = array('Ä','Ö','Ü','ä','ö','ü','ß','^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!');
static $drop_char_replace = array('Ae','Oe','Ue','ae','oe','ue','ss',' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', '', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' , ' ', ' ', ' ', ' ', ' ', ' ');

Dann gibt es im Verzeichnis rebuild_search_index das nötige Werkzeug, um die Suchworttabellen neu aufzubauen (die Suchwort-Tabellen werden automatisch vorher initialisiert, die obige Code-Änderung ist dabei sofort wirksam).

FERTIG!
Wer findet sich bereit, das auf die Schnelle (ohne ein laufendes Forum zu stören) zu testen und hier bekanntzugeben, ob es funktioniert hat?

Grüße aus München
Hermann

Verfasst: 21.11.2002 23:43
von Elo
@Acid

Laufen die in die Tabelle einzugebenen Wörter durch die phpBB Scripten funktioniert es mit den Umlauten nicht. Gehe ich über phpMyAdmin
an die Datenbank, kann ich Umlaute in die Tabelle search_wordlist eingeben ohne das sie umgewandelt werden.
Ich hatte daher erst einmal einige Zeit damit verbracht das Problem im Script zu lokalisieren, leider ohne Erfolg.

Kann es evt. doch an der PHP-Version liegen?
At Home läuft Version 4.2.3
Auf dem Webserver läuft Version 4.1.2

Hatte nach dem Problem auch schon gegoogelt. Auch ohne Erfolg.

@Hermann
ich bin mehr durch Zufall auf dieses Problem gestossen.
ist es ein Problem der Datenbank, die in ANSI abspeichert, während man ASCII damit vergleicht (oder umgekehrt)
Die Spalte word_text in welcher die Wörter abgespeichert werden ist als BINARY definiert. Warum?! Damit habe ich mich bisher noch nicht befasst.
Die Umwandlung der Umlaute und des scharfen ß in ae, ou, ue und ss ist nicht grundsätzlich verkehrt, sondern sogar die allgemeingültige Lösung.
Für mich ist dies nicht die allgemeingültige Lösung. Die für mich beste Lösung wäre, wenn in die Datenbank auch Begriffe mit Umlauten gespeichert werden könnten.
Du als "simples Forumsmitglied im Thairing" solltest doch das "Leid" der Expants bezüglich der Umlaute kennen, welches da wäre -Die Mehrzahl können sie nicht nutzen, da der PC an dem sie sitzen häufig keine deutsch Codierung beherrscht-.

Hier kommen wir zu einem weiteren Problem.
Die Expants übergeben ihre Umlaute also in Form ae, oe usw. an das Forum, der Beitrag wird verarbeitet und
1. korrekt mit ae, oe usw. in die search_wordlist-Tabelle eingetragen sowie
2. komplett als Beitrag in die posts_text-Tabelle eingegeben.

Eines der hervorragenden Eigenschaften des phpBB ist, dass Suchbegriffe in gefundenen Suchergebnissen farblich zu erkennen sind. Dies funktioniert leider dann nicht, wenn ein User (z.B. Expant) in einem Beitrag die Umlautform ae, oe benutzt. Ich suche zB. nach "München", die Beiträge der Expants werden zwar gefunden, jedoch möchte das Script bei der Ausgabe die Suchbegriffe in der Form "München" oder wie es in meinem Forum z.Z geschieht "M&uuml;nchen" highlighten. Muenchen würde demnach nicht hervorgehoben.

Also wäre noch eine Funktion angebaracht die vor dem Einfügen in die Tabelle "posts_text" sämtliche Umlaute in der Form ae, oe in korekkte Umlaute umwandelt.

Code: Alles auswählen

Dort müsste der Array $drop_char_match um die Zeichen 'Ä','Ö','Ü','ä','ö','ü','ß' vergrößert werden und der Array $drop_char_replace um die Zeichen 'Ae','Oe','Ue','ae','oe','ue','ss'. 
Yoh, so mache ich es, jedoch wandle ich das 'ß in ein 'sz' um.
Jetzt braucht man noch ein Ex- und Hopp-Programm, das die bisherigen Forumseinträge neu durchkämmt
Gibt es schon. Nennt sich "Rebuild Search Index" und wird von mir genutzt.
Oder hat einer der Leser zufällig schon die richtige Umgebung drauf?
Der Apache+PHP+MySQL läuft bei mir lokal. Perl ist nicht unbedingt notwendig, habe ich dennoch aufgrund des alten YaBB-Forums installiert.

@Highfly
Den Glance Mod kenne ich noch nicht, werde ich mir mal ansehen.
Wie Du an meiner derzeitigen Sig erkennen kannst habe ich mir einen passenden MOD geschrieben.

Grüsse,
Elo

Verfasst: 21.11.2002 23:47
von Elo
Hallo Hermann,

ich bin mit meinem Beitrag gerade eben, nach einigen Unterbrechungen, fertig geworden.

Die Lösung ist IMO etwas komplizierter.
Ich mache mich mal daran und extrahiere meine Lösung aus dem Board.

Elo

Verfasst: 22.11.2002 00:13
von Elo
@all

Hier der Code.

Doch zuvor:
Selbstverständlich und Wichtig der Hinweis:
Bitte vor allen Änderungen an den Scripten ein Backup des bestehenden Scriptmaterials erstellen!

In der functions_search.php

diese Zeilen:

Code: Alles auswählen

	static $drop_char_match =   array('^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!');
	static $drop_char_replace = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', '',  '',   ' ', ' ', ' ', ' ', '',  ' ', ' ', '',  ' ',  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' , ' ', ' ', ' ', ' ',  ' ', ' ');
durch folgende ersetzen:

Code: Alles auswählen

	static $drop_char_match =   array('^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß');
	static $drop_char_replace = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', '', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' , ' ', ' ', ' ', ' ', ' ', ' ', 'ae', 'oe', 'ue', 'ae', 'oe', 'ue', 'sz');

In der viewtopic.php

Den gesamten Block:

Code: Alles auswählen

	//
	// Note! The order used for parsing the message _is_ important, moving things around could break any 
	// output
	//

	//
	// If the board has HTML off but the post has HTML
	// on then we process it, else leave it alone
	//
	if ( !$board_config['allow_html'] )
	{
		if ( $user_sig != '' && $userdata['user_allowhtml'] )
		{
			$user_sig = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $user_sig);
		}

		if ( $postrow[$i]['enable_html'] )
		{
			$message = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $message);
		}
	}

	//
	// Parse message and/or sig for BBCode if reqd
	//
	if ( $board_config['allow_bbcode'] )
	{
		if ( $user_sig != '' && $user_sig_bbcode_uid != '' )
		{
			$user_sig = ( $board_config['allow_bbcode'] ) ? bbencode_second_pass($user_sig, $user_sig_bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $user_sig);
		}

		if ( $bbcode_uid != '' )
		{
			$message = ( $board_config['allow_bbcode'] ) ? bbencode_second_pass($message, $bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $message);
		}
	}

	if ( $user_sig != '' )
	{
		$user_sig = make_clickable($user_sig);
	}
	$message = make_clickable($message);
hinter:

Code: Alles auswählen

		else
		{
			$message = preg_replace($highlight_match, '<span style="color:#' . $theme['fontcolor3'] . '"><b>\1</b></span>', $message);
		}
	}
verschieben.
Folgende Zeilen:

Code: Alles auswählen

                  $hold_string = str_replace('<!-- #sh -->', '<span style="color:#' . $theme['fontcolor3'] . '"><b>', $hold_string);
					}
					else if ( $hold_string == '<!-- #eh -->' )
					{
						$hold_string = str_replace('<!-- #eh -->', '</b></span>', $hold_string);
					}
durch diese ersetzten:

Code: Alles auswählen

						$hold_string = str_replace('<!-- #sh -->', '[color=#' . $theme['fontcolor2'] . ':'.$postrow[$i]['bbcode_uid'].'][b:'.$postrow[$i]['bbcode_uid'].']', $hold_string);
					}
					else if ( $hold_string == '<!-- #eh -->' )
					{
						$hold_string = str_replace('<!-- #eh -->', '[/b:'.$postrow[$i]['bbcode_uid'].'][/color:'.$postrow[$i]['bbcode_uid'].']', $hold_string);
					}
Die Zeile:

Code: Alles auswählen

			$message = preg_replace($highlight_match, '<span style="color:#' . $theme['fontcolor3'] . '"><b>\1</b></span>', $message);
abändern in:

Code: Alles auswählen

			$message = preg_replace($highlight_match, '[color=#' . $theme['fontcolor2'] . ':'.$postrow[$i]['bbcode_uid'].'][b:'.$postrow[$i]['bbcode_uid'].']\1[/b:'.$postrow[$i]['bbcode_uid'].'][/color:'.$postrow[$i]['bbcode_uid'].']', $message);
So, dann will ich mal hoffe, dass ich nichts vergessen habe.

Es grüsst,
Elo

Verfasst: 22.11.2002 00:26
von Hermandl
Elo hat geschrieben: Für mich ist dies nicht die allgemeingültige Lösung. Die für mich beste Lösung wäre, wenn in die Datenbank auch Begriffe mit Umlauten gespeichert werden könnten.
Hi Elo,
die Umlaute werden sehr wohl ganz normal abgespeichert, d. h. die gespeicherten Texte werden unverändert abgespeichert, also die Umlaute bleiben im Forumstext.

Nur ist es eben mit meiner Variante möglich, das Wort übermäßig mit folgenden Suchbegriffen immer zu finden: übermäßig, uebermaessig, Übermaeßig, uebermÄssig ... u.v.a.

--------------------------------------------------------------------------------------

Unser Admin hat mir mehr zugetraut als ich mir selbst und mittlerweile die kleine Code-Änderung sofort ins Original-Forum eingebracht und die Wortliste neu aufgebaut.

Das Ergebnis ist auf den ersten Blick sehr gut. Es gibt nur noch Ungereimtheiten, für die es aber möglicherweise eine noch nicht gefundene andere Begründung gibt: DasWort bedürftigkeitsbescheinigung wird nicht gefunden. Hat jemand dafür eine Erklärung?

Grüße aus München
Hermann

Verfasst: 22.11.2002 00:47
von Elo
@Hermandl

Funktioniert Texthighlighting bei diesen Wort(-abwandlungen)?

Suche mal nach einem Begriff welches mit einem Umlaut beginnt wie zB. 'über' sofern dieses kein Stopword ist.

Elo

Verfasst: 22.11.2002 00:48
von Elo
Vergessen:

Such mal nach 'rftigkeitsbescheinigung'.
Ich hatte ein ähnliches Phänomen.

Elo