![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz