Thema: Delphi UTF-8 in Datei schreiben

Einzelnen Beitrag anzeigen

Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
652 Beiträge
 
Delphi 12 Athens
 
#5

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 10:09
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 ?

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:
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;
Das heißt: hier ist alles ein normaler String und erst beim writeln passiert die Umwandlung. Das kommt dann so auch korrekt an.

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:
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;
Hier wird der Zeichensatz einfach beim Erstellen des Objekts angegeben und gut ist.
  Mit Zitat antworten Zitat