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.