Autor Beitrag
Willmar
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1

Windows 7, Windows 2008 R2
Delphi 2007 für Win32 Ent
BeitragVerfasst: Di 15.01.08 13:43 
Hallo Allerseits,

Ich habe in einer Delphi 7 Applikation ein BLOB aus einer Datenbank ausgelesen und in eine temporäre Datei gespeichert. Anschließend diese in ein Memo eingelesen.

Zitat:
...
blob.Seek(0, soFromBeginning);
with TFileStream.Create(Tempfile1, fmCreate) do
try
CopyFrom(blob, blob.Size)
finally
Free
end;
...

Form1.Memo1.Lines.LoadFromFile(tempfile1);
...
Das ist jeweils ein normaler Text, der als ANSI-File abgespeichert wurde. Klappte tadellos.

Unter Delphi2007 erzeugt der selbe Code ein UNICODE-File, das mit Notepad z.B. tadellos lesbar ist. Mit LoadFromFile ins Memo wird nur der erste Buchstabe des Textes angezeigt.
Vermutung: Delphi2007 erzeugt wohl UNICODE, das kann aber TMemo nicht darstellen. Also: tTNTMemo gekauft. Ergebnis: Kein Unterschied.

Folgendes habe ich festgestellt: Wenn ich das Tempfile1 mit Notepad öffne und in ANSI wieder speicher, ist es ok, kann TMemo wieder lesen. Wenn ich das Tempfile1 in Notepad einfach nur speichere (also wieder UNICODE), dann kann es tTNTMemo auch komplett darstellen.

Ich vermute, Delphi2007 erzeugt ein etwas korruptes UNICODE-File.

habt Ihr eine Idee, wie ich das Problem lösen kann?

Danke!

Willmar
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 15.01.08 13:53 
Hallo und :welcome: in der Entwickler-Ecke!

Ich tippe darauf, dass deine Speicher-Routine kein Byte-Order-Mark an den Anfang der Datei setzt. Das ist in der Regel $FFFE bzw $FEFF. Daran erkennen dann Editoren, ob es ein Unicode-File ist, und wie die zwei Byte pro Zeichen sortiert sind.

Notepad hat weitere Heuristiken um Unicode-Dateien ohne BOM zu erkennen, was bis einschließliche Windows XP dazu führte, dass Textdateien, in denen nur "Blödsinn" steht (ohne Punkt, Leerzeichen oder Zeilenumbruch) nicht korrekt geöffnet wurden. Die TNTs sind aber wohl auf diese Markierung angewiesen.

Dafür spricht auch, dass in der Memo dan nur das erste Zeichen zu sehen ist, ansonsten müsste da noch ein "ÿþ" oder "þÿ" davor stehen. Das Problem sollte sich also lösen lassen, wenn du an den Anfang der Datei diese beiden Bytes einfügst - welche Reihenfolge weiß ich jetzt nicht auswendig.

_________________
We are, we were and will not be.
Willmar Threadstarter
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1

Windows 7, Windows 2008 R2
Delphi 2007 für Win32 Ent
BeitragVerfasst: Di 15.01.08 13:58 
Hallo Daniel,

nachdem ich schon fast eine Woche an dem Problem rumknubbele, bin ich richtig baff, so schnell eine Antwort zu bekommen.
Besten Dank!

Hast Du noch einen Tipp, wie ich die beiden Zeichen (siehe mein Code-Schnipsel) an den Anfang der Datei bekomme?

Danke!

Willmar
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 15.01.08 14:42 
Das sollte so funktionieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var bom: Word;
//...
  bom := $FEFF;
  Write(bom, sizeof(Word));

_________________
We are, we were and will not be.
Willmar Threadstarter
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1

Windows 7, Windows 2008 R2
Delphi 2007 für Win32 Ent
BeitragVerfasst: Di 15.01.08 14:49 
Hallo Daniel,

ich hatte auch gerade mit einem Hex-Editor rausbekommen, dass tatsächlich der ByteOrder Mark fehlte. Ich habe dann mal manuell $FFFE davor geetzt und sofort konnte mein Delphi2007 wieder sauber damit arbeiten (Zumindest tTNTMemo).

Mit Deinem Code-Beispiel werde ich das sicher jetzt stemmen.

herzlichen Dank!

Willmar
Willmar Threadstarter
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1

Windows 7, Windows 2008 R2
Delphi 2007 für Win32 Ent
BeitragVerfasst: Di 15.01.08 15:06 
Ergänzung:
Hat alles prima funktioniert!

Ganz herzlichen Dank - das Forum und seine Mitglieder sind einfach KLASSE!

Willmar