![]() |
UTF-8 in Datei schreiben
Moin,
ich habe da eine Sache die ich nicht verstehe, in ![]() Wenn ich das jetzt wie folgt umsetze passiert folgendes: 1) Bei ShowMessage wird der Text korrekt umgewandelt angezeigt 2) In der Textdatei steht wieder ein Ansi-String und die Umlaute sind nicht umkodiert worden Warum das denn ??? Gruß Hans
Delphi-Quellcode:
var
U: UTF8String; R: RawByteString; OutFile: Text; procedure TUTF8Test.Button1Click(Sender: TObject); begin AssignFile(Outfile, 'Testausgabe.xml'); ReWrite(OutFile); R := UTF8Encode('Hermann Jürgensen GmbH - äöüÄÖÜß'); SetCodePage(R, $0000, False); // R hat die CodePage kopiert bekommen, daher explizit auf RAW umstellen ShowMessage(R); // *1 writeln(outfile, R); CloseFile (Outfile); end; |
AW: UTF-8 in Datei schreiben
Diese uralten Funktionen AssignFile, Writeln und Co. können nur Ansi-Strings.
Du musst hier z.B. mit Streams arbeiten. |
AW: UTF-8 in Datei schreiben
Was steht denn in "R"?
Und was steht in der Datei? Und damit meine ich binär! Jedes dargestellte Zeichen ist die Interpretation eines Bytewertes bzw. einer Bytewertfolge. Da sind Showmessage und Konsorten eher nicht geeignet um Inhalte zu überprüfen. Gruß K-H |
AW: UTF-8 in Datei schreiben
wenn ich mir die Datei als HEX anzeigen lasse dann steht an den entsprechenden Stellen
E400 F600 FC00 usw. Wenn ich (aus Bequemlichkeit und weil ich es nicht besser kann) also weiter mit writeln und co arbeiten will muss ich die Umsetzung (sind ja nur Umlaute und das SZ) vorher mittels StringReplace und nicht mit UTF8Encode machen, richtig ? gruss Hans |
AW: UTF-8 in Datei schreiben
Zitat:
Nein, musst du nicht, du musst die Umwandlung in den UTF8-String direkt im writeln machen, dann funktioniert das eigentlich. Ich habe hier auch noch ein paar (wenige) Code-Altlasten, wo ich das noch nicht aktualisiert habe, und da funktioniert das so seit langem problemlos:
Delphi-Quellcode:
Das heißt: hier ist alles ein normaler String und erst beim writeln passiert die Umwandlung. Das kommt dann so auch korrekt an.
procedure TmyLog.AddMessageToFile(aFilename, aLogMessage: string; aPrefix: Char);
var fileH: TextFile; begin if not logDisabledByError then begin try assignFile(fileH,aFilename); if fileExists(aFilename) then append(fileH) else rewrite(fileH); writeln(fileH,UTF8Encode(aPrefix+' ['+DateTimeToStr(now)+'] '+aLogMessage)); closeFile(fileH); except logDisabledByError:=true; end; end; Eine moderne Alternative ist aber auch nicht viel schwerer in der Umsetzung, gibt es für die Streams auch diverse Klassen, die einem die Arbeit erleichtern. Besonders einfach finde ich den Streamwriter. Eine etwas neuere Log-Variante sieht etwa so aus:
Delphi-Quellcode:
Hier wird der Zeichensatz einfach beim Erstellen des Objekts angegeben und gut ist.
procedure TLog.AddMessageToFile(filename, logMessage: string; prefix: char);
var logFile: TStreamWriter; begin logFile:=TStreamWriter.Create(filename,true,TEncoding.UTF8); try logFile.WriteLine(prefix+' ['+DateTimeToStr(now)+'] '+logMessage); finally logFile.Free; end; end; |
AW: UTF-8 in Datei schreiben
@Bbommel: Vielen Dank - Dann mache ich es erst einmal Quick & Dirty und kuck mir das andere in Ruhe an :-)
Hans |
AW: UTF-8 in Datei schreiben
Zitat:
Allerdings ist es mir eine Rätsel wieso man da dieses SetCodePage benötigt. In D7 ist das nicht nötig und da reicht ein simples UTF8Encode und der String ist dann UTF8-codiert. |
AW: UTF-8 in Datei schreiben
Zitat:
|
AW: UTF-8 in Datei schreiben
Zitat:
Ab D2009 ist der String = UnicodeString und nicht mehr wie früher String = AnsiString. Und da muss man halt bei solchen Uraltfunktionen mittlerweile einig Tricks anwenden damit es so funktioniert wie es früher Funktionerte. Das beste ist einfach diese nicht mehr zu verwenden. |
AW: UTF-8 in Datei schreiben
Zitat:
|
AW: UTF-8 in Datei schreiben
Prüfe mal vorher ob die Datei auch als UTF8 eingestellt ist. Ich habe da sProblem auch mal gehabt, da war die Ausgabe zwar richtig, dadurch das die Datei selber aber Unicode und nicht UTF8 war, hat er es entsprechend falsch umgesetzt.
Einmal die Datei neu als UTF8 gespeichert und nochmal getestet - Einwandfrei. Vielleicht ist es bei dir ja ähnlich. |
AW: UTF-8 in Datei schreiben
Zitat:
Gruß Hans |
AW: UTF-8 in Datei schreiben
Du kannst auch einfach die Funktionen TFile.WriteAllLines() und TFile.WriteAllText() aus System.IOUtils nutzen.
Damit spart man sich viele Zeilen. |
AW: UTF-8 in Datei schreiben
Zitat:
Andere Varianten wurden ja hier schon genannt: eine TStringList eignet sich dann als angenehme Art, mittels StringList.SaveToFile, wenn es darum geht, eine ganze Datei in einem Rutsch zu schreiben, die du vorher im Speicher zusammensetzt. Und dann gibt es ja noch die von DieDolly gerade genannte Methode mit TFIle... Und wenn dir langweilig ist, kannst du natürlich auch "von Hand" in den TFileStream schreiben - aber da finde ich die obigen Methoden die angenehmere Variante. |
AW: UTF-8 in Datei schreiben
Da es ja keinen Danke-Button gibt ... Danke !!
Hans |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 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