Einzelnen Beitrag anzeigen

knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Delphi und Linux - Encoding-Salat?

  Alt 9. Aug 2019, 13:06
kleiner Nachtrag:

tatsächlich würde ich inzwischen von einem Bug in der System.SysUtils.pas sprechen - nur für Linux.

ANSI-Dateien werden fälschlicherweise als UTF-8 deklariert und können dann nicht z.B. in eine Stringlist geladen werden (Fehlermeldung "No mapping for the Unicode character exists in the target multi-byte code page"). Der Default-Wert beim Feststellen der Kodierung sollte nicht UTF-8 sein, wenn UTF-8 vorher explizit ausgeschlossen wurde.

Macht man sich die Mühe und surft mit dem Debugger durch die Bibliotheken, wenn man unter Linux eine ANSI-Datei in eine Stringlist laden will (was überigens auch beim Öffnen einer Datei mit der XMLDocument-Komponente passiert), dann kann man im richtigen Moment eingreifen und die Kodierung von UTF-8 auf ANSI korrigieren. Dann wird die Datei fehlerfrei geladen. Macht man das während des Ladens der Datei in die XMLDoc-Komponente, dann kann die XML-Datei anschließend fehlerfrei ausgewertet und angezeigt werden - inklusive Sonderzeichen!

Der Fehler hat seinen Ursprung (wie gesagt) beim Feststellen der Kodierung, für Stringlisten in System.Classes.pas in Zeile 6894. Dort wird TEncoding.GetBufferEncoding (System.SysUtils.pas Zeile 32708) aufgerufen, was dann unter Linux den falschen default-Wert "UTF-8" zurückliefert.

Liefert diese function das korrekte Ergebnis "ANSI" (durch manuellen Eingriff) zurück, läuft anschließend alles fehlerfrei.
Liefert sie für eine ANSI-Datei den Standardwert UTF-8 zurück, klappt die Umwandlung der ANSI-Sonderzeichen nicht, weil die Kodierung nicht zu UTF-8 passt.

Aktuell habe ich nur eine geerbte Klasse TMyEncoding = class(TEncoding) in der ich dann ein paar Dinge überschrieben habe. Dadurch kann ich wenigstens schonmal selber die richtigen Codierungen angeben.
Allerdings wird aus den Systembibliotheken natürlich nach wie vor auf die Hauptklasse TEncoding zugegriffen.

Gibt es eine Möglichkeit, die Original-Function irgendwie zu überschreiben?

Es geht um die "class function TEncoding.GetDefault: TEncoding;" bzw. "class property Default: TEncoding read GetDefault;" aus der Klasse TEncoding, System.SysUtils.pas
Wolfgang
  Mit Zitat antworten Zitat