Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden? (https://www.delphipraxis.net/143450-utf8-kodierte-datei-ohne-bom-korrekt-memo-laden.html)

freejay 16. Nov 2009 14:33


UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
Wenn ich über
Delphi-Quellcode:
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
Delphi-Quellcode:
LoadFromFile(Filename,TEncoding.UTF8)
versuche zu laden, dann bleibt das Memo ganz leer.

Wie mach ich's richtig?

(Delphi 2009er Projekt)

Bernhard Geyer 16. Nov 2009 15:01

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
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.

himitsu 16. Nov 2009 15:58

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
Oder die Datei in irgendwas laden (z.B. einen Stream), dann selbst umcodieren und zum Schluß an Memo.Text übergeben.

Bbommel 16. Nov 2009 16:06

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
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.

freejay 16. Nov 2009 16:34

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

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;

freejay 16. Nov 2009 17:01

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
Sieht so aus, als hätte ich nicht korrekt als utf8 kodierte Dateien zum Testen verwendet. Die ErrorMessage ist trotzdem "sehr hilfreich"...

mjustin 16. Nov 2009 17:11

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
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,

freejay 16. Nov 2009 17:28

Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
 
Das leuchtet mir schon ein. Schade, dass aber LoadFromFile mit diesen Dateien (UTF8 ohne BOM) nicht umgehen kann...

himitsu 16. Nov 2009 18:18

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

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

mjustin 16. Nov 2009 18:38

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

Zitat von himitsu
Zitat:

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:

Delphi-Quellcode:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:11 Uhr.
Seite 1 von 2  1 2      

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