AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Muss eine "leere" Datei ein BOM enthalten?
Thema durchsuchen
Ansicht
Themen-Optionen

Muss eine "leere" Datei ein BOM enthalten?

Ein Thema von Der schöne Günther · begonnen am 30. Mai 2017 · letzter Beitrag vom 31. Mai 2017
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Muss eine "leere" Datei ein BOM enthalten?

  Alt 30. Mai 2017, 18:05
Dumme Frage wahrscheinlich. Angenommen wir haben ein leere Text-Datei. Ganz leer, null Byte. .NET gibt für System.IO.File.ReadAllText(path, Encoding.Unicode); einen leeren String zurück, Delphi fliegt bei TFile.ReadAllText(filePath, TEncoding.Unicode); mit einer EEncodingError -Exception "Invalid source array" raus.

Technisch ist das wenig verwunderlich, denn die Delphi-Implementation versucht als erstes direkt den zwei Byte langen BOM aus dem Stream zu lesen der null Byte Inhalt hat und scheitert daran.

Meine Frage: Ist das korrekt so? Wenn vereinbart ist "Unicode", dann kann ich die zwei BOM-Bytes auch zwingend erwarten? Wenn sie fehlen ist es keine valide Datei?
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#2

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 30. Mai 2017, 18:16
Zunächst hat man einen Directory Eintrag mit Zeiger auf den Sektor.
Im Sektor muss zumindest ein 0 Byte als Zeilenende Marker sein.
Liest Du Utf ein, öffnest Du als Utf, dann wird Utf Kennung und Zeilenende Marker erwartet.

Denke Du solltest die Exception abfangen.
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 30. Mai 2017, 18:24
Nein, eine leere Textdatei muß nicht zwingend ein BOM haben.
Außer man Speicher einen leeren String mit BOM in einer Datei, dann kann/muß auch natürlich auch nur der BOM in der Datei drin stehen.

Du gibst ein Encoding vor (zweiter Parameter), also darf da nur bei einem "falschen" Encoding der EEncodingError kommen,
denn es wäre doch auch korrekt, wenn die Datei eben ohne BOM erstellt wurde.
Denn es ist das "Default" encoding, welches genommen wird, wenn kein BOM vorhanden ist.
Anders wäre es, wenn dieser Parameter ein "Check" wäre und auf ein bestimmtes Encoding prüft. (für TXT ist in Windows nunmal die aktuelle CodePage das Default, also ANSI)



Mach mal eine Meldung ans QC
und hoffe dieser 7-8 Jahre alte Bug wird dann schnell behoben.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Mai 2017 um 18:28 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 30. Mai 2017, 18:39
Wenn ich es jetzt richtig verstehe dann ist es doch kein Bug.

Gebe ich explizit ein Encoding mit Preamble an dann muss die Datei dieses enthalten, auch wenn der Netto-Inhalt ein leerer String ist.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 30. Mai 2017, 23:10
Eine leere Datei enthält einen Leerstring, der ist zu allen möglichen Kodierungen kompatibel oder aber er ist vollkommen ohne Eigenschaft (null,Nil....)
Wenn man sich den Eintrag in der Wikipedia anschaut, dann ist das BOM ein "nice to get".

Wenn Du Dir z.B. eine Word-.DOC-Datei anschaust, dann ist das ein fröhliches Durcheinander von 16 und 8-Bit Codierungen, natürlich ohne BOM.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

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

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 31. Mai 2017, 05:57
Ist das nicht ein bisschen Pseudo Diskussion?
Immerhin haben wir einen Aufruf, wo Unicode explizit angegeben wird.
Wenn es sich um Basisfunktionen handelt, könnte ich mir gut vorstellen, dass es eine TFile Funktion gibt, die das Encoding prüft, sodass man programmatisch anschließend die richtige Open / Load Methode wählen kann.
Ich habe aus alten Zeiten noch so ein Prinzip im Kopf, irgendwas mit "reine Lehre".
Es gibt eine Schicht, die einfach Operationen durchführt, ohne Prüfung, reine Lehre. Die muss natürlich genügend "Werkzeug" liefern, die Methoden auch richtig einzusetzen. Hat z.B. was mit Performance zu tun und Redundanz.
Darüber kann dann eine Komfortschicht liegen.
Und da wäre man dann bei .Net / MS. Die machen für meinen Geschmack immer gern irgendetwas "komfortabel". Leider weiß man nie genau, was, wie warum. Auf API Ebene kenne ich das allerdings kaum aus der Praxis, aber es entspräche deren Programm / OS Logik. Bspw. Notepad, kann nichts, aber das erstaunlich gut, u.a. Dateien unterschiedlichster encodings öffnen.
Gruß, Jo
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 31. Mai 2017, 06:39
Bspw. Notepad, kann nichts, aber das erstaunlich gut, u.a. Dateien unterschiedlichster encodings öffnen.
https://en.wikipedia.org/wiki/Bush_hid_the_facts
  Mit Zitat antworten Zitat
jobo

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

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 31. Mai 2017, 07:48
Haha, das kannte ich nicht!
Zum Glück habe ich nur von "Öffnen" geschrieben.

Im Grunde wird MS mit sowas ja zum Sklaven genau dieser windelweichen "Komfort" Thematik, von der ich oben schrieb. Notepad versucht halt, beim Öffnen ein Encoding zu interpretieren, schlimmer aber, dass es beim Speichern dann dieser eigenen Logik nicht folgt. (Oder halt einfach konsequent mit / ohne BOM oder Speichervarianten arbeiten würde)

Bedeutet zum Thema m.E., "wo ist das Problem?" Streng genommen ist das Verhalten von TFile ok und wenn es anders wäre, würden vielleicht Delphi Programme eines Tages auch in der BHTF Hall of Fame landen.
Gruß, Jo
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Muss eine "leere" Datei ein BOM enthalten?

  Alt 31. Mai 2017, 08:12
Ich meckere gerne, aber ich sehe es genauso. Das Verhalten der Delphi RTL ist hier im Vergleich zu .NET strenger/pingeliger, aber auch "korrekter".
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz