avanti: regsrch.pl

Thomas Berger ThB at gymel.com
Mo Jul 31 01:39:26 CEST 2000


>>>
Gedacht ist eigentlich folgendes: =

In acindex.pl gibt es ein Unterprogramm link_prep,
das zur Aufgabe hat, alle Sonderzeichen in die
sogenannte URL-encodierung zu verwandeln,
also etwa "=FC" in "%81". Dies tut es nur unsystematisch
und stellenweise auch falsch (die letzten beiden
Zeilen lauten z.B. s/\AA/%AA/g: und muessten eigentlich
lauten s/\xAA/%AA/g;, ich habe leider ueberhaupt
keine Ahnung, wie sich \A auswirkt [und man muesste =

es sowieso total anders machen, aber das gehoert =

nicht hierher]

in regsrch.pl werden die uebergebenen Werte mittels
Aufruf von ReadParse nach %in transportiert, dabei
wird diese URL-encodierung bereits aufgeloest.
Der uebergebene Registereintrag wird spaeter der
Variablen wert_zeige zugewiesen und ausgegeben.
Dabei muesste nur die uebliche Vorsicht angewandt
werden, naemlich "&", ">" und "<" zu escapen, damit
sie im HTML auch sichtbar werden.

Stattdessen wird auch noch eine Codierung fuer
uebergebene Werte der Form "\x3E" etc. gemacht,
von denen ich mir ueberhaupt nur schwer vorstellen
mag, wie und wo solche zustandegekommen sein koennten,
jedenfalls gibt es keinen Hinweis darauf, dass
hier Herrn Kuhns Problem stecken koennte.
[Aus dem Register kamen wegen impliziter Umcodierung
bereits ANSI-Daten, daher wird nicht die Routine anz_prep =

aus acwww25.pl benutzt zur Vorbereitung der Anzeige des =

Suchbegriffs, soviel glaube ich zu verstehen...]


Andererseits ist das beobachtete Zeichen =C2, also
\xc2 und da lohnt es sich doch, alles von Hinten
nach vorne zu verfolgen und dann doch bei der
entgleisten Ersetzung
s/\C2/%C2/g; in Zeile 489 von acindex.pl zu landen:
\C hat naemlich in den neueren Perl-Versionen die
Bedeutung als Platzhalter fuer ein "Oktet" (dies
wird in Perl 5.6 benoetigt, falls mit Unicode-
Strings gearbeitet wird). Insofern hat unter
Perl 5.6 die Anweisung die folgende Bedeutung:
Ersetze jede "2", der ein Zeichen vorausgeht,
zusammen mit diesem Zeichen durch (die Codierung
von) "=C2". In aelteren Perl-Versionen wurde
dieser Ersetzungsbefehl wegen Undefiniertheit =

wohl stillschweigend uebergangen oder produzierte =

eine Warnmeldung...

Insofern sind also in acindex.pl voerdergruendig
die fehlerhaften Zeilen (mit fehlendem "x" hinter "\")
zu reparieren, eigentlich aber sollte generell auf
alle Werte, die zu Hyperlinks verwurstet werden,
einheitlich folgende Operation angewandt werden =

(geklaut aus cgi.pm):

s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg,

also: Ersetze jedes Zeichen ausser Buchstaben, Ziffern,
"_", "." und "-" durch seine URL-encodierung.

HTH
Thomas Berger


P.S.: Der Vollstaendigkeit halber:
Die falsche Ersetzung \AA -> (Codierung von) "=AC" =

betrifft alle Registerwerte, die mit "A" beginnen.
Evtl. hat also jemand im Signaturenregister schon
einmal Merkwuerdigkeiten (bzw. Nichtsortierzeichen
bei der Anzeige des Suchbegriffs) gesehen...

Warum ueberhaupt versucht wurde \xC2 gesondert zu
behandeln, bleibt aber mysterioes: Es ist der =

OSTWEST-Windows-Wert fuer r mit Hacek, ein Zeichen, =

das wohl auch als Praefix gewisser ORDER-Registereintraege
genutzt wird...
<<<


Anmerkung heute: \A ist "Anfang des Suchstrings", m.E.
seit Perl 5.003 oder spaetestens 5.004.


viele Gruesse
Thomas Berger




Mehr Informationen über die Mailingliste Allegro