[Allegro] Vb.330: Trick 81 - Internen Zeichencode ermitteln

Bernhard Eversberg b-eversberg at gmx.de
Do Jan 7 11:35:34 CET 2021


Verlautbarung 330 zur allegro-Entwicklung                    2021-01-07
-----------------------------------------

Trick 81 : Internen Code knacken
================================
Bei Untersuchung einer älteren Datenbank unbekannter Herkunft erhob
sich die Frage, wie man eigentlich schnell mal eben feststellen könne,
in welcher Zeichencodierung die Daten geschrieben sind - also ob intern
mit DOS-, Windows- oder Unicode gearbeitet wird. 
Leider steht das nicht in der .cfg oder in einer .ini-Datei. 
Beim Stöbern in den Parameterdateien kann man es durchaus herauskriegen,
aber dazu braucht's gehobene Kenntnisse der Exportparameter (Kap.10!).
Es gibt zwei andere Möglichkeiten:

Methode 1: Augenschein
----------------------
Wer den Editor WinVi verwendet, kann sich z.B. eine der .xld-Dateien
vornehmen und einfach mal reinschauen. Im Datentext wird man sehr
schnell irgendwelche Umlaute entdecken - oder aber sonderbare falsche
Zeichen an den betreffenden Stellen. Man schaltet dann einfach zwischen
den drei Codes um: Dazu dienen die drei Buttons oben rechts:
 Windows / DOS / UTF8
Wenn z.B. bei Klick auf UTF8 die Umlaute richtig aussehen, dann ist es
Unicode UTF8. Meistens wird DOS richtig sein, denn das ist der Standard.
"Na schön", wird man sagen, "aber geht's nicht einfacher und ohne dass 
man einen Editor sich besorgen muss, den man gar nicht hat oder nicht mag?"

Methode 2: FLEX
---------------
Mit dem FLEX-Befehl  xcode  kann man beliebigen Text mit Hilfe einer
beliebigen Parameterdatei in einen anderen Code umwandeln. Am besten
eignen sich die Indexparameter, weil darin auf jeden Fall die Umlaute
umgewandelt werden müssen, z.B. 'ä' in 'ae'
Kurz und gut, hier ist der vielleicht fast kleinstmögliche FLEX, mit
dem es geht: (geschrieben im Windows-Code, z.B. mit Notepad)

  cco.flx : character code ermitteln
var "äöüß"
  Codierung mit Indexparam, p-Liste:
xcod ip

  Resultat:
  falls   dann kommt raus:
  ASCII : AOZ
  ANSI  : aeoeuess
  UTF8  : äöüß
  Es reicht daher, das erste Zeichen zu prüfen:
  
if "A" var "ASCII"
if "a" var "ANSI"
if "ä" var "UTF8"
ins $code

  Wert anzeigen
var "Interner Code : " $code
mes


Man kopiert sich dies als Datei cco.flx in seinen FLEX-Ordner und 
gibt dann ein:

X cco

und - schwupp - erscheint eine Ansage wie z.B.
     Interner Code : ASCII

Doch Sie werden abermals sagen "Na schön, aber önnte das nicht auch 
einfach eingebaut sein in den FLEX, der alle Eigenschaften der 
Datenbank anzeigt, nur eben bis jetzt nicht den Zeichencode?"
Zwei zu Null für Sie - das stimmt. Und es wurde umgesetzt:
Man besorge sich schnell mal eben die aktuelle Datei dbi.rtf:
    X gf dbi.rtf
Danach: Menü "Global / Datenbank-Information", oder eingeben:  h dbi

Natürlich kann man die oben abgedruckten FLEX-Zeilen in jeden eigenen FLEX
einbauen, in dem man den Zeichensatz ermitteln will. Der steht dann
also in der Variablen $code, nachdem der obige Abschnitt durch ist.

Wer's ganz genau wissen will, kann die Datei  dbi.rtf  inspizieren, um zu
sehen, wie die FLEX-Zeilen innerhalb des RTF-Textes aussehen. Wirklich
"einfach" ist das jedoch nicht, oder sieht nicht so aus...

Skeptiker können das korrekte Funktionieren auch mit den zwei anderen
mitgelieferten Demo-Banken testen, und zwar mit diesen zwei Aufrufen
aus dem allegro-Programmordner:
  a99 mini-ans\mini
und
  a99 mini-uni\dat
Dann jeweils eingeben:   h dbi  oder   Menü "Global / Datenbank-Info"

Nachwort
--------
Kritiker könnten nachbohren: Warum wurde nicht längst eine interne
Variable geschaffen, etwa "Code", so dass man nur schlicht  var Code
zu schreiben hätte, um in einem FLEX den Wert zu ermitteln.
Da ist was dran. Aber andererseits ist in den jetzt 30 Jahren der
Existenz und Entwicklung von FLEX noch nie ein Fall bekannt geworden,
wo man diesen Wert gebraucht hätte.
Tip:
Abhilfe wäre nicht schwer: Am Beginn des _start.flx den oben abgedruckten
Abschnitt einfügen, nur mit $Code statt $code. Dann hätte man in der
gesamten Sitzung diesen Wert zur Verfügung, also mit  var $Code



Mehr Informationen über die Mailingliste Allegro