AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi und Linux - Encoding-Salat?

Ein Thema von knaeuel · begonnen am 8. Aug 2019 · letzter Beitrag vom 9. Aug 2019
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz