AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Thema durchsuchen
Ansicht
Themen-Optionen

UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

Ein Thema von freejay · begonnen am 16. Nov 2009 · letzter Beitrag vom 17. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
269 Beiträge
 
Delphi 11 Alexandria
 
#1

UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 14:33
Wenn ich über LoadFromFile(Filename) eine utf8-kodierte Datei OHNE BOM in ein Memofeld lade, dann wird sie als ASCII interpretiert und folglich falsch angezeigt. Wenn ich sie mit LoadFromFile(Filename,TEncoding.UTF8) versuche zu laden, dann bleibt das Memo ganz leer.

Wie mach ich's richtig?

(Delphi 2009er Projekt)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 15:01
Lade die Datei in einen Stream in dem du den UTF8-BOM an den Anfange geschrieben hast.
Lade den kompletten Stream mit BOM ins Memofeld.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 15:58
Oder die Datei in irgendwas laden (z.B. einen Stream), dann selbst umcodieren und zum Schluß an Memo.Text übergeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#4

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 16:06
Oder zeilenweise einlesen:

Delphi-Quellcode:
...
var fileH: textFile;
    newLine: RawByteString;
...
begin
  ...
  assignFile(fileH,filename);
  reset(fileH);
  while not eof(fileH) do begin
    readln(fileH,newLine);
    Memo1.Items.Add(UTF8toString(newLine));
  end;
  closeFile(fileH);
  ...
end;
Habe ich so oder so ähnlich auch hier und da gemacht und bisher keine Probleme damit.

Bis denn
Bommel

Edit: Man sollte Dateien auch öffnen und schließen... Fehlendes reset/closeFile ergänzt.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
269 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 16:34
Zitat von Bernhard Geyer:
Lade die Datei in einen Stream in dem du den UTF8-BOM an den Anfange geschrieben hast.
Lade den kompletten Stream mit BOM ins Memofeld.
Das habe ich probiert. Bekomme aber immer ein leeres Memofeld und ErrorMessage "Zugriff verweigert":

Delphi-Quellcode:
procedure TForm37.Button1Click(Sender: TObject);
var
  FileStream: tFileStream;
  Preamble: TBytes;
  memStream: TMemoryStream;
begin
  if OpenDialog1.Execute then
  begin
    FileStream := TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyWrite);
    MemStream := TMemoryStream.Create;

    Preamble := TEncoding.UTF8.GetPreamble;
    memStream.Write(Preamble[0],length(Preamble));
    memStream.CopyFrom(FileStream,FileStream.Size);
    memStream.Seek(0,soFromBeginning);

    memo1.Lines.LoadFromStream(memStream);

    showmessage(SysErrorMessage(GetLastError));

    FileStream.Free;
    memStream.Free;
  end;
end;
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
269 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 17:01
Sieht so aus, als hätte ich nicht korrekt als utf8 kodierte Dateien zum Testen verwendet. Die ErrorMessage ist trotzdem "sehr hilfreich"...
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#7

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 17:11
UTF-8 mit BOM hatte ich heute auch als Fehlerquelle in Delphi 2009 lokalisiert - ein XML SAX Parser beschwerte sich darüber ("Content not allowed in prolog"), dass er bei TStringlist.SaveToFile( ..., TEncoding.UTF8) immer erzeugt wird.

Ein BOM wird bei UTF-8 nicht empfohlen:

A UTF-8 BOM is explicitly allowed by the Unicode standard, but is not recommended
http://en.wikipedia.org/wiki/Byte-or...rk#cite_note-2

Zitat:
"The Unicode Standard 5.0, Chapter 2:General Structure" (PDF). pp. 36. http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf. Retrieved 2008-11-30. "Use of a BOM is neither required nor recommended for UTF-8, but may be encountered in contexts where UTF-8 data is converted from other encoding forms that use a BOM or where the BOM is used as a UTF-8 signature"
The presence of the UTF-8 BOM may cause interoperability problems with existing software that could otherwise handle UTF-8
http://en.wikipedia.org/wiki/UTF-8#Byte-order_mark

Als Workaround habe ich im Internet (bei Expert Exchange) den Tipp entdeckt, die UTF8 Encoding Klasse abzuleiten.


Bei Verwendung von TXmlDocument.SaveToFile dagegen wird für UTF-8 kein BOM geschrieben - was (für XML Dateien) das Problem einfach löst.


Cheers,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
269 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 17:28
Das leuchtet mir schon ein. Schade, dass aber LoadFromFile mit diesen Dateien (UTF8 ohne BOM) nicht umgehen kann...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 18:18
Zitat von freejay:
Das leuchtet mir schon ein. Schade, dass aber LoadFromFile mit diesen Dateien (UTF8 ohne BOM) nicht umgehen kann...
Warum sollte es?
Dateien ohne BOM werden per Standard als ANSI angesehn.

Es sei denn man stellt die FileIO-APIs auf "DOS-Modus" um.
MSDN-Library durchsuchenSetFileApisToOEM MSDN-Library durchsuchenSetFileApisToANSI
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#10

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?

  Alt 16. Nov 2009, 18:38
Zitat von himitsu:
Zitat von freejay:
Das leuchtet mir schon ein. Schade, dass aber LoadFromFile mit diesen Dateien (UTF8 ohne BOM) nicht umgehen kann...
Warum sollte es?
Wenn LoadFromFile einen zweiten Parameter für das Encoding hat:

LoadFromFile(Filename,TEncoding.UTF8) TXmlDocument macht es ja schon wieder ganz anders und läßt das BOM beim Schreiben von UTF-8 XML Dateien weg.

Michael
Michael Justin
  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 01:23 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