![]() |
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 |
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
:oops: Ups, das vergeß ich immer gern ... dieses Encodingparameter gibt es ja erst seit D2009,
joar, dann müßte man da nochmal nachsehn, wie dort was nicht so will, wie es soll. Und bei XML hat es einen anderen Grund, denn da ist es laut Definition so, daß XML-Dateien ohne Kodierungsinformationen (BOM und/oder Encoding-Attribut) per Standard als UTF-8 angesehn wird. (bei "normalen" Text-Dateien eben ANSI oder OEM unter "DOS") [edit] Hab es jetzt nciht getestet, aber laut den Beiden
Delphi-Quellcode:
müßte das gewählte Encoding eigentlich auch genutzt werden. :gruebel:
TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding);
TEncoding.GetBufferEncoding(Buffer, Encoding); (LoadFromFile geht ja über einen FileStream) |
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Danke Leute! Habe jetzt eine funktionierende Version.
|
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Delphi-Quellcode:
hatte bei mir zunächst nicht funktioniert. Das lag aber an fehlerhaften Dateien (wie schon oben erwähnt).
LoadFromFile(FileName,Encoding)
|
Re: UTF8-kodierte Datei (OHNE BOM!) korrekt in Memo laden?
Dieses "Fehlverhalten" bezüglich UTF8 gibt es auch schon ewig :wall:
UTF8Encode und Co. handhaben es auch so ... wobei mir da eine Exception dann lieber wäre. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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