[Allegro] Trick 57: Sauberes Filtern (Ohne Umcodierung)
Thomas Berger
ThB at Gymel.com
Mo Okt 15 11:03:45 CEST 2007
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Lieber Herr Eversberg, liebe Liste,
> Fußnote zur Umcodierung
> =======================
> Wenn man im FLEX schreibt:
> var "xyz"\ins #nnn
> was passiert dann?
> Dann wird der Text, der in der iV steht, so behandelt, als hätte man
> ihn gerade im Schreibfeld eingegeben. Und was ist das Problem?
> Was man im Schreibfeld eingibt, das ist intern immer ANSI-Code.
> Im FLEX kann es aber sein, wenn er z.B. mit X-Editor erstellt
> wurde oder wenn man ASCII-Daten bearbeitet, daß der iV-Inhalt nicht
> ANSI ist, sondern ASCII. Was per Schreibfeld eingegeben wurde,
> das wird per o-Tabelle der Indexparameter in den internen Daten-
> bankcode gewandelt, normalerweise also von ANSI nach ASCII.
> Deshalb wird im Normalfall unser ASCII-"xyz" VOR der Übergabe an
> die Verarbeitung noch per o-Tabelle nach ANSI gewandelt - um dann
> sofort wieder zurückverwandelt zu werden. Na schön, dann ist es
Dieses Verhalten war mir bislang nur bei Avanti aufgefallen (oder
hatte ich es bei a99 nur verdraengt), sollte aber abgeschafft werden,
weil es unsauber ist:
Ich stelle mir die Interaktion der verschiedenen Komponenten als
auf verschiedenen Ebenen liegend vor:
0. Die Repraesentation der Zeichen in der Datenbank, also wie
sie in den .ald-Dateien konkret gespeichert sind.
Diese ist nicht klar geregelt. Sie kann (A.CFG) CP437 oder CP850
oder allegro-OSTWEST sein, ohne dass irgendjemand weiss, welches
von den dreien. Sie kann (etwa Neutralformat) allegro-Windows
oder CP1252 oder ISO8859-1 sein, oder UTF-8 oder eine beliebige
andere Codetabelle.
1. Die Repraesentation bei der Vearbeitung eines Datensatzes, also
waehrend er im Arbeitsspeicher ist.
Diese ist identisch mit der vorigen, denn allegro sieht keine
globalen Einlese- bzw. Wegschreibefilter vor.
Auch Anwendervariable unter Kontrolle von Parameterdateien,
insbesondere #u1 in den Sonderabschnitten #-1, #-2 etc. der
Indexparameterdatei sehen Benutzereingaben nicht wie eingegeben,
sondern in den Zeichensatz der Anwendung gewandelt.
2. Das Zeichenmodell der Flex-Sprache, sowohl in a99 als auch in Avanti:
Sprachkonstrukte der Flex-Sprache sind in 7-bit-ASCII. Spezielle
Flex-Komponenten wie die iV und $-Variable werden bei der Interaktion
mit Kategorien im Arbeitsspeicher keiner Wandlung unterzogen (also
etwa "var #20" oder "var $otto\ins #20" loest keine implizite
umcodierung aus) folgerichtigerweise sind Zeichenkonstanten, die im
Flex-Quelltext eingebettet sind als *im Zeichensatz der Datenbank*
codiert zu betrachten: var "Müller".
An dieser Stelle greift das oben in der Fussnote beschriebene
Verhalten, das solche "Müller" zweimal wandelt, bis guenstigstenfalls
der Originaltext genommen wird, unguenstigenfalls etwas, das niemand
kennt.
[Vage erinnert: Gab/Gibt es nicht ein Umcodierungsproblem mit der
"zweiteiligen" Form qrix "von at bis", oder lag das nur auf der Ebene
der Parameterdatei (Umcodierungsabschnitt wurde fuer den Endebegriff
nicht ausgefuehrt?]
3. Interaktion mit Ein- und Ausgabe:
Die DOS-Module nehmen hier keine Wandlung vor.
3a. Eingaben im Schreibfeld (und in der Suchbefehlszeile) von a99
muessen global mittels o.apt in den Zeichensatz der Anwendung
umgewandelt werden und dann abgearbeitet (als Belegung einer Kategorie
oder als Flex). Die Fussnote oben legt nahe, dass dies nicht ganz
genau so passiert, sondern dass zunaechst an den Trennzeichen "\"
zerlegt und dann in den Zeichensatz der Datenbank gewandelt wird.
Ausserdem gab/gibt es (nur Avanti?) Probleme mit dem Zeichen 255 der
Windows-Codetabelle (y mit Trema), die es eigentlich nicht geben
sollte. Diese Behandlung mittels o.apt erfolgt in a99 automatisch,
also "transparent"
3b. Ausgaben und Eingaben in den beiden Indexfenstern, im
Formularfenster und im Kurzlistenfenster und Views erfolgen ebenfalls
transparent, d.h. es erfolgt eine automatische Wandlung hin- und
zurueck mittels o.apt zwischen der Zeichencodierung der Datenbank
und der der Benutzeroberflaeche.
3c. Ausgaben im Anzeigefeld erfolgen unter Kontrolle der Parameterdatei
und den *head.rtf und erfordern beachten der Umcodierung (etwa durch
einbinden von d.apt). Direkte Schreibaktionen ins Anzeigefeld mittels
"show" erfordern vorherige explizite Umcodierung (Flex-Befehl "ansi")
3d. Anzeige von (DOS-)Hilfetexten in Alertboxen unterwirft diese einer
impliziten Umcodierung
3e. Alertboxen (mess, yesno) und Abfragen (select) erfordern eine
explizite Wandlung des anzuzeigenden Textes sowie (select) eine der
Benutzereingabe
3f. Fenstertitel und Ergebnismengennamen (set i) muessen explizit
gewandelt werden, bei Fenstertiteln mit grosser Vorsicht, weil hier
der Systemzeichensatz (typischerweise CP1252) getroffen werden muss
und nicht die o.apt-gewandelte Windows-Repraesentation des Datenbank-
zeichensatzes.
3g. RTF-Hilfedateien und eingebettete Flips sind wie im RTF-Header
angegeben codiert (naja, sie geben normalerweise "\ansi\ansicpg1252"
an, obwohl sie allegro-Windows-codierte Fonts benutzen. Zu testen
waere, wie eingebettete Flexe codiert werden muessen, wenn man eine
"\ascii"-codierte RTF-Datei nutzen will)
3h. In den Flip-Sondervariablen sind sowohl die Flips #uX* und #uZ*,
als auch die Fangtexte #uY* in der Codierung der Datenbank (das ist
konsistent mit 1. oben)
[noch etwas vergessen?]
Strenggenommen gibt es keinen Grund, warum (3e und 3f, ueber "show"
liesse sich streiten) fuer die Anseteuerung des GUI die notwendigen
Umcodierungen explizit erfolgen muessen und nicht alles transparent
wie bei den anderen GUI-Elementen ablaeuft.
4. Es gibt nun noch Codierungsbefehle in der Flex-Sprache,
4a. set c0/c1 bzw. switch coding
Ganz alte Versionen von avanti etwa verstanden den gesamten Job
(also das aktuelle Flex-Programm) als "ANSI"-codiert, mit "switch
coding" konnte man das aendern. Bereits bei Avanti 1.7. jedoch
war das Default wie bei 2. beschrieben. Diese Form der Globalitaet
ist eher problematisch, weil der Befehl ja nicht ausserhalb der
Flexdatei steht, auf die er wirkt und diese bereits teilweise
abgearbeitet ist.
set c0/c1 bezieht sich lt. Dokumentation v.a. auf folgende
Dateioperationen (Einlesen und Wegschreiben), die dann bei
set c1 einer Umcodierung durch o.apt unterworfen werden.
Zu klaeren waere noch, ob sich "set c" ueberhaupt noch auf im
Flex eingebettete Stringkonstanten (qrix PER "Müller")
bezieht, bzw. ob hier Unterschiede zwischen a99 und avanti
bestehen bzw. zwischen "set c" und "switch coding"
4b. set U0/U1/U2
bezieht sich auf die Unicode-Semantik, jedoch nur auf "insert"-
Befehle. Ein und Ausgabe sind also nicht betroffen!
[ In (live generierten) avanti-Jobs darf man daher nicht erzeugen
lassen
qrix PER "$Benutzereingabe"
sondern muss diese von avanti wandeln lassen:
set U1
#u22 PER "$Benutzereingabe"
set U0
var #u22
switch coding 0
qrix
switch coding 1
(switch coding 1 hier korrekt?). Das ist zwar etwas umstaendlich,
dafuer aber gut kontrollierbar.
]
viele Gruesse
Thomas Berger
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3-nr1 (Windows XP)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFHEyzxhKFJT0F1FsoRApAxAJsGCsBpA+22DusvDgHk63u5QeGj6QCeLWCo
KriXmyyvhyOnS/tDA8Wa4Vw=
=hXYL
-----END PGP SIGNATURE-----
Mehr Informationen über die Mailingliste Allegro