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
Antwort Antwort
Seite 1 von 2  1 2      
Schokohase
(Gast)

n/a Beiträge
 
#1

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 12:13
Ja, das ist kein Wunder, denn du schreibst in der XML-Datei
XML-Code:
<?xml version="1.0" encoding="ISO-8859-15"?>
...
was für ein Encoding du verwendest ... aber du hälst dich daran einfach nicht, sondern nimmst jedes Encoding, was dir in den Sinn kommt.

Also, wenn du ein XML-Datei in UTF-16 kodiert speicherst, dann muss die Datei anfangen mit
XML-Code:
<?xml version="1.0" encoding="UTF-16"?>
...
und wenn du die in UTF-8 kodiert speicherst, dann muss die Datei anfangen mit
XML-Code:
<?xml version="1.0" encoding="UTF-8"?>
...
oder
XML-Code:
<?xml version="1.0"?>
...
  Mit Zitat antworten Zitat
knaeuel

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

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 12:38
nein, das trifft das Problem nicht. Selbstverständlich korrigiere ich die erste Zeile bei Bedarf, bevor ich die Daten dem XML-Parser vorwerfe.

Was die Kodierung angeht, sind wir einfach nur bei Textdateien. Die Konvertierungsversuche bzw. das Einlesen der Kodierung ist völlig unabhängig vom XML-Code. Da wird nichts ausgewertet.

Der Fehler "No mapping for the Unicode character exists in the target multi-byte code page" tritt auf, sobald die Datei in eine Stringlist geladen wird. z.B. so:

Delphi-Quellcode:
var dat:TStrings;
...
dat:=TStringlist.Create;
dat.LoadFromFile(dateiname); //<-- erzeugt Fehler unter Linux
Wolfgang

Geändert von knaeuel ( 8. Aug 2019 um 12:40 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 12:46
Die Varianten sind ja wohl im Versuch entstanden, es Linux recht zu machen, wenn ich das richtig verstanden habe.

Aber letztlich ist es wie es ist, einer der Vorteile von XML ist, dass die Datei selbst klar definiert, wie die Kodierung ist. Das muss man dann "einfach" einhalten.
Linux kann das mit Sicherheit. Im eigenen Programm muss man natürlich selber dafür sorgen.

@roter Kasten.
Auch wenn man die Codierung ignoriert, muss ja nichts gutes dabei rauskommen
Gruß, Jo
  Mit Zitat antworten Zitat
knaeuel

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

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 12:51
Danke für die Antworten bis hierhin, aber bitte geht doch auf die Fragen ein:

Warum wird ASCII unter Windows nicht als ASCII erkannt?
Warum erkennt Linux gleich mehrere Kodierungen als UTF-8?

Siehe Tabelle:
Encoding-Tabelle klein.png

Vergesst dabei bitte den XML-Part und stellt euch vor, es ginge einfach nur um Textdateien.
Wolfgang

Geändert von knaeuel ( 8. Aug 2019 um 12:53 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 12:58
XML Reader bekommen die encoding Info aus dem XML Header.
Gewöhnliche Textdateien haben ein Byte-Order-Mark (BOM)

Warum wird die xml Datei in eine StringList eingelesen?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 13:03
Um die Fragen zu beantworten, müsste man die Implementierung von getbufferencoding kennen und sie mit Deinen Textdateibeispielen debuggen?
Ist diese Frage, also eigentlich "getBufferEndcoding" überhaupt deterministisch? Oder ist es eine Frage davon, welches Stück Text gerade im Buffer steckt?
Wenn mehrere Encodings als Antwort möglich sind, welche gibt getBufferEncoding zurück?
Kann der Text auch kaputt encoded sein oder schließt Du das aus?
Gruß, Jo
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 14:03
Delphi-Referenz durchsuchenTEncoding.GetBufferEncoding

Und die Doku sagt, nur wenn es ein BOM gibt, dann gibt es ein passendes Encoding zurück, ansonsten gibt es Default zurück.

Und bei ASCII gibt es kein BOM also ...
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
112 Beiträge
 
Delphi 12 Athens
 
#8

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 14:14
Warum wird ASCII unter Windows nicht als ASCII erkannt?
Warum erkennt Linux gleich mehrere Kodierungen als UTF-8?
ASCII umfasst die Zeichen mit den Codes von 0 bis 127 und ist damit eine Untermenge von ANSI. Auch die ersten 128 Zeichen bei UTF-8 sind identisch mit ASCII.
Achim
  Mit Zitat antworten Zitat
knaeuel

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

AW: Delphi und Linux - Encoding-Salat?

  Alt 8. Aug 2019, 14:33
ah, danke, manchmal sieht man den Wald vor Bäumen nicht mehr. Delphi schaut nur aufs BOM => unter Linux wird alles ohne BOM als UTF-8 deklariert.

Dann werde ich zumindest die Default-Entscheidung für Linux anpassen.

ASCII/UTF7/ANSI-Dateien werden bei Linux korrekt als nicht-UTF8 erkannt und danach trotzdem als UTF8 deklariert. Dann nehme ich da lieber auch ANSI als default. Dann passt es wenigstens oftmals und nicht mehr nie.

Abschließend nochmal die beantworteten Fragen:

Ist es erwartungsgemäß, dass Windows die Ascii-Datei für Ansi erklärt? Und wie siehts mit Linux aus?
Ja, das ist erwartungsgemäß, denn Delphi unterscheidet einfach nicht weiter.

Liegt das mit den ganzen angeblichen UTF-8-Dateien bei Linux am Dateisystem? Oder macht mein Code nicht was er soll? Oder hat Ddelphi da Schwächen?
Ja, das würde ich als kleine Schwäche bezeichnen. Etwas besser ist die Programmierung unter Windows und es leuchtet mir auch nicht ein, wieso das nicht für Win und Linux gleich läuft. Bei mir läuft es jetzt gleich. (Default-Rückgabe bei Dateien ohne BOM)

Warum wird ASCII unter Windows nicht als ASCII erkannt?
Bei Dateien ohne BOM unterscheidet Delphi einfach nicht weiter und gibt den default-Wert (Windows: ANSI) zurück.

Warum erkennt Linux gleich mehrere Kodierungen als UTF-8?
Bei Dateien ohne BOM unterscheidet Delphi einfach nicht weiter und gibt den default-Wert (Linux: UTF8; bei mir jetzt geändert auf ANSI) zurück.

Warum wird ASCII unter Windows nicht als ASCII erkannt?
Warum erkennt Linux gleich mehrere Kodierungen als UTF-8?
ASCII umfasst die Zeichen mit den Codes von 0 bis 127 und ist damit eine Untermenge von ANSI. Auch die ersten 128 Zeichen bei UTF-8 sind identisch mit ASCII.
Danke für die Hilfe!
Wolfgang
  Mit Zitat antworten Zitat
knaeuel

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

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
Antwort Antwort
Seite 1 von 2  1 2      


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 21:02 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