Lazarus, UTF8, Firebird und Default Character Set NONE

Ich habe in den letzten Tagen ein wenig mit Lazarus herumgespielt, um damit eventuell (auf Linux) portierbare Frontends für alte, existierende Datenbanken zu bauen. Dabei bin ich über die Problematik gestolpert, dass Lazarus standardmäßig überall mit UTF8 arbeitet, die alten Datenbanken sich aber um Zeichensätze nicht gekümmert haben. Alte Frontends liefen unter Windows irgendwie mit einem Zeichensatz vergleichbar (identisch?) mit ISO Latin 1 (a.k.a ISO 8859-1), der Firebird-Datenbank war es eh egal, was an Zeichen rausgeholt und darin gesichert wurde, kurzum: passte alles. Mit Lazarus/UTF8 und alten Datenbankinhalten in Latin-1 wird alles ein wenig herausfordernder. Aber letztlich ist das alles nichts wirklich Wildes, wenn man weiß, wie es funktioniert.

Man hat drei Möglichkeiten, mit dieser Herausforderung umzugehen:

  1. Für neue Projekte legt man die Datenbank selbst („create database ‚/path/to/db/foobar.fdb‘ default character set UTF8;“) und alle Spalten („foo varchar(42) character set UTF8“) direkt als UTF8 an. Dann muss man im mit Lazarus und den Firebird/Interbase-Datenbankkomponenten gebauten Frontend (so gut wie nichts) beachten.
  2. Ältere Datenbanken konvertiert man komplett mit allen Spalten und allen Inhalten von NONE auf UTF8. Dann hat man wie oben im Frontend auch Ruhe, aber solch eine Konvertierung kann in Arbeit ausarten.
  3. Oder man lässt die alte Datenbank in Ruhe und sorgt im neuen Frontend an den entscheidenden Stellen manuell für eine Zeichensatzumwandlung.

Für den dritten Fall ist Folgendes zu tun (ohne Anspruch auf Vollständigkeit):

  • TIBConnection: Die Datenbankverbindung auf CharSet:= ‚ISO8859_1‘ setzen und mittels UseConnectionCharSetIfNone:= True eine automatische Umwandlung von Datenbankinhalten für die visuellen Datenbankkomponenten aktivieren. In einem DBGrid beispielsweise werden deutsche Umlaute dann richtig dargestellt (stünde das hingegen auf False, dann sähe man nur Fragezeichen statt Umlauten)
  • uses … LConvEncoding
  • Bei jeder TSQLQuery müssen Zeichenketten aus dem Frontend in Richtung Datenbank mittels UTF8ToISO_8859_1() umgewandelt werden. Wer sich SQL-Statements also zusammenbaut und dafür die Inhalte von Eingabefelder verwendet, muss die erst einmal durch die Zeichensatzumwandlung jagen.

Eventuell schreibe ich es demnächst noch ausführlicher auf, aber der geneigte Lazarus-Programmierer sollte vielleicht damit schon auf den richtigen Lösungsweg kommen.

Links:

Kurztipp: no matching host key type found

Nach dem Upgrade auf Ubuntu 22.04. scheitert erneut der Zugriff per ssh auf eine VM mit einem Uralt-SCO-Unix, in diesem Falle mit folgender Fehlermeldung:

$ ssh vmsco
Unable to negotiate with 192.168.47.11 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
lost connection

Warum auch immer (bestimmt aus Sicherheitsgründen) übermittelt ssh den id_dsa.pub nicht mehr an den SSH-Server. Abhilfe:

Beim einmaligen Zugriff erweitert man den Aufruf von ssh/scp um eine Option:

$ ssh -oHostKeyAlgorithms=+ssh-dss vmsco

Um die Option dauerhaft zu setzen, packe man diese in die globale SSH-Konfiguration für den Namen und die IP-Adresse des SSH-Servers (die alten Optionen stammen noch aus dem älteren Tipp):

$ sudo vi /etc/ssh/ssh_config.d/vmsco.conf

Host vmsco
  HostKeyAlgorithms +ssh-dss
  KexAlgorithms +diffie-hellman-group1-sha1
  Ciphers +aes128-cbc

Host 192.168.47.11
  HostKeyAlgorithms +ssh-dss
  KexAlgorithms +diffie-hellman-group1-sha1
  Ciphers +aes128-cbc

Kurztipp: KDE über xrdp

Ich habe auf einem Rechner mit Ubuntu 22 sowohl XFCE als auch KDE als Desktop installiert. Beim Remote-Zugriff über RDP erscheint jedoch nur ein Login ohne Auswahlmöglichkeit des Window-Managers und in meinem Falle wurde immer XFCE gestartet.

Abhilfe: Man erzeuge eine ~/.xsession und schreibe „startplasma-x11“ hinein.

echo "startplasma-x11" > ~/.xsession

P.S.: Ich werde dennoch bei XFCE bleiben. KDE hat zwar mehr Bling Bling, aber bei XFCE muss ich für manche Dinge einfach weniger herumklicken.