[Allegro] Frage zu P/Q-Tabelle

Thomas Berger ThB at Gymel.com
Di Sep 30 15:29:32 CEST 2008


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Lieber Herr Eversberg, liebe Liste,

moderne Webbrowser sind nicht besonders modern, was den
Umgang mit normalisierten Unicode-Zeichen angeht. D.h.
eigentlich (man denke an Sortierungen und Identitaetsvergleich)
ist A + Umlaut die in mancherlei bessere Darstellung, die
Aequivalenzdarstellung als praekombiniertes Zeichen nur ein
Service. Reale Browser schaffen es m.W. nicht, einer Folge
Grundbuchstabe + Diakritikum anzusehen, dass sie hier einen
(aus aesthetischen Gruenden vorzuziehenden) praekombinierten
Glyphen vorraetig haben, man muss schon froh sein, wenn die
beiden Einzelzeichen halbwegs sinnvoll angeordnet werden und
nicht verrutschen oder sich vermengen...

Insofern ist es vorteilhaft, sowohl was Datenbanken in OSTWEST-
Codierung angeht als auch solche mit einer der beiden Formen von
Unicode-Codierung, getrennt erfasstes vor der Ausgabe zu
rekombinieren. Das geht z.B. mit globalen Ersetzungen (wobei
die im Fall von OSTWEST-Datenbanken etwas krumm zu notieren
sind, da sie erst nach der Akzentvertauschung greifen?) hat
aber gewisse Grenzen:

1. Globale Ersetzungen, die innerhalb des Zeichensatzes
   operieren, also etwa zwei OSTWEST-Zeichen zu einem anderen
   OSTWEST-Zeichen zusammenfassen, sind unproblematisch

2. Globale Ersetzungen in einen anderen Zeichensatz sind
   problematisch, denn jeder definierte Ersetzungsbefehl
   wird nacheinander abgearbeitet, Ergebnisse frueherer
   Ersetzungen werden also weiteren Ersetzungen unterzogen.
   Es geht, wenn der Zielzeichensatz mit Escapes arbeitet,
   d.h. OSTWEST->7bit-ASCII mit HTML/XML-Parameterentitaeten
   ist ein Klacks, OSTWEST nach UTF-8 ist eher nicht moeglich.
   Nachteil ist ausserdem, dass die eigentliche Parameterdatei
   auf teilaufbereiteten Zeichenketten operiert, "ā" kann
   ich noch schlechter als "Makron + a" ansehen, ob die
   Zeichenkette mit einem Buchstaben beginnt...

3. Lokale Ersetzungen helfen aus dem bei 2. beschriebenen
   Problem mit der Teilaufbereitung, erfordern aber, dass die
   fragliche Parameterdatei jegliche Ausgabe in/an ein
   spezialisiertes Unterprogramm schickt, das dann die Ersetzungen
   vornimmt. Vorhandene Parameterdateien muessten dafuer sehr
   massiv umgearbeitet werden.
[Ein Spezialabschnitt "Parametrierte Ausgabe" analog den "dow w"-
Konstruktionen der Flexsprache waere ein Desiderat: Hier koennten
dann nicht nur Zeichenumsetzungen vorgenommen werden, sondern auch
andere Untersuchungen des Ausgabetexts, etwa ob eine URL drin
vorkommt und mit Markup versehen werden sollte etc.]

Ich habe nun festgestellt, dass die P/Q-Tabellen, die ja eigentlich
fuer nach "Verfahren 2" (also intern UTF-8) codierte Datenbanken
eingefuehrt wurden, fuer den obigen Zweck, also moeglichst spaete
Durchfuehrung recht allgemeiner Ersetzungen, anscheinend brauchbar
sind:

P 208 117 "ū"

bringt (in der betreffenden Parameterdatei wurde keine Akzent-
vertauschung durchgefuehrt) die OSTWEST-Bytes Makron + U in
Avanti zu ū

Dazu habe ich nun folgende Fragen:

a) "208 117" ist mitnichten legales UTF-8 (es ist ja legales
   OSTWEST), die Ersetzung funktioniert aber dennoch. Bug oder
   Feature? D.h. behaelt sich allegro vor, in zukuenftigen Versionen
   Ersetzungsbefehle, die kein valides UTF-8 enthalten, als
   Fehler zu quittieren bzw. zu verwerfen?
   [Das Handbuch 10.2.4.7 spricht recht vage von "Kombinationen
   von 2 bzw. 3 Zeichen", gemeint sind aber gerade keine Zeichen!]


b) In UTF-8 ist immer klar, wo ein Zeichen anfaengt und ob ein
   Byte ein Zeichen bzw. ein Zeichenanfang oder im inneren einer
   Bytesequenz vorkommt. Dementsprechend - wenn man P/Q-Tabellen
   fuer einzelne UTF-8-Zeichen nutzt, gibt es immer maximal einen
   Eintrag, der als Ausgangspunkt der Ersetzung zutreffend ist.
   Nutzt man es hingegen fuer Kontraktionen, wird die Reihenfolge
   wichtig (ich gehe mal davon aus, dass anders als bei p/q keine
   Ersetzungsmatrix aufgebaut wird, sondern eine sequentielle
   Abarbeitung erfolgt): Werden P/Q-Tabellen so wie eingegeben
   abgearbeitet oder aus Effizienzgruenden durchsortiert?

c) unicode.rtf sagt, "Wenn kein P/Q-Befehl greift, treten die
   p/q-Befehle in Kraft." Das ist nicht falsch, legt aber
   ein Missverstaendnis nahe, naemlich dass dieser Satz eine
   Information enthaelt, insbesondere zum Verhalten beim "Greifen"
   von P/Q-Befehlen. (codier.rtf hingegen enthaelt die wichtige
   Information "Die P/Q-Befehle haben Priorität vor den p/q-Befehlen,
   d.h. sie werden beim Abarbeiten einer Exportzeile zuerst ausgeführt."
   wobei der Nachsatz nahelegt, dass p/q-Befehle ausgefuehrt werden.

   Experiment ergibt:

   Das Resultat von P/Q-Befehlen scheint normalen p/q-Codierungen
   nicht mehr unterworfen zu werden, wohl aber noch den Drucker-
   Ersatzdarstellungen.

   D.h. wenn ich

p & "&"
P 208 117 "ū"

habe, dann wird 208 117 zu ū gewandelt. Habe ich hingegen

p .38 .38 97 109 112 59
P 208 117 "ū"

dann kommt "ū" heraus (ich finde das in Ordnung, weil
ich normalerweise stets noch ein unbenutztes Zeichen einsetze,
um nackte "&"-Zeichen zu erzeugen, d.h. ich habe sowieso

p .14 .38
p .38 .38 97 109 112 59

und setze dann

P 208 117 "u♫#772;"

   Jedenfalls: Man kann argumentieren, dass sowohl unicode.rtf als
   auch codier.rtf im Sinne der Aussagenlogik korrekt sind, "ex
   falso sequitur quod libet" haben wir ja schliesslich alle
   gelernt, und wenn etwas "zuerst ausgefuehrt wird" heisst das
   noch lange nicht, dass etwas anderes als zweites ausgefuehrt
   wird. Beide Dokumentationstexte schreien allerdings danach,
   missverstanden zu werden, hier muss etwas passieren. Und
   bezueglich des wie ueblich feinen Unterschieds zwischen
   Umcodierungen und Drucker-Ersatzdarstellungen wird ja nichts
   dokumentiert.


d) unicode.rtf gibt als Syntax
>>>
P zzz yyy xxx abc
  mit zzz yyy xxx = Dezimalcodes des UTF-8-Zeichenwertes
        abc = Was dafür einzusetzen ist (direkte Zeichen)
  Alternativ:
P xyz abc
   mit  xyz = direkte UTF-8-Zeichen
<<<

  Ich habe allerdings (nicht ganz die frischeste) Avanti-Version
  damit Probleme gehabt. Sprich

P Ðu ū
bzw.
P 208 117 ū

  funktionierten nicht (und zwar beim ersten Datensatz anders
  "nicht" als beim zweiten im gleichen Export), Umschliessen
  des Ersetzungsstrings mit "...", also

P Ðu "ū"
bzw.
P 208 117 "ū"

  funktioniert anstandslos. Wie ist die Syntax fuer die P/Q-Tabelle
  nun genau?


e) unicode.rtf spricht von zwei- bzw. drei-Byte-Kombinationen fuer
   die UTF-8-Zeichen. Vierbyte-Kombinationen gibt es in Unicode aber
   durchaus auch, zumindest seit Unicode 4.irgendwas (aktuell
   5.irgendwas): Gibt es da noch etwas zu beachten, wenn ja, fuer wen
   (Anwenderfalle bzw. Handlungsbedarf fuer die Entwicklungsabteilung?)


f) das (a99-"online") Handbuch verweist in Kapitel 10.2.4.7 nur
   unspezifisch auf http://www.allegro-c.de/ (wo man dann wohl
   unter "Ruckzuck" zu schauen haette, wie das mit P/Q-Funktioniert.
   Das ist nicht so guenstig.

viele Gruesse
Thomas Berger

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3-nr1 (Windows XP)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iQCVAwUBSOIpvGITJZieluOzAQI3iQQAosrEC6QYNo3lEC4ZcwildO/2E5BxCFNO
hyHGkLQxvHOrwGrzJaAOXP9i+RcHXnAQPm6w/fRiSpSmdj7qPFVaFSJL4GyaAutg
AIXRMOIJEfimHoUvluL38BPC0toTF7R1pGF+lV6ZR71rcRGKJPN5BUpHpM9pAwq1
cSvE2clTxmQ=
=zr38
-----END PGP SIGNATURE-----



Mehr Informationen über die Mailingliste Allegro