![]() |
UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Wenn ich über
Delphi-Quellcode:
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)
Delphi-Quellcode:
versuche zu laden, dann bleibt das Memo ganz leer.
LoadFromFile(Filename,TEncoding.UTF8)
Wie mach ich's richtig? (Delphi 2009er Projekt) |
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. |
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.
|
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Oder zeilenweise einlesen:
Delphi-Quellcode:
Habe ich so oder so ähnlich auch hier und da gemacht und bisher keine Probleme damit.
...
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; Bis denn Bommel Edit: Man sollte Dateien auch öffnen und schließen... ;) Fehlendes reset/closeFile ergänzt. |
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Zitat:
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; |
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"...
|
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 ![]() Zitat:
![]() 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, |
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...
|
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Zitat:
Dateien ohne BOM werden per Standard als ANSI angesehn. Es sei denn man stellt die FileIO-APIs auf "DOS-Modus" um. ![]() ![]() |
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Zitat:
Delphi-Quellcode:
TXmlDocument macht es ja schon wieder ganz anders und läßt das BOM beim Schreiben von UTF-8 XML Dateien weg.
LoadFromFile(Filename,TEncoding.UTF8)
Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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