Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi UTF-8 in Datei schreiben (https://www.delphipraxis.net/202565-utf-8-datei-schreiben.html)

H.Bothur 18. Nov 2019 08:25

UTF-8 in Datei schreiben
 
Moin,

ich habe da eine Sache die ich nicht verstehe, in dem Beitrag hier ist sehr schön beschrieben wie man einen normalen Text in UTF-8 umwandelt.

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;

Bernhard Geyer 18. Nov 2019 08:49

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.

p80286 18. Nov 2019 09:22

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

H.Bothur 18. Nov 2019 09:52

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

Bbommel 18. Nov 2019 10:09

AW: UTF-8 in Datei schreiben
 
Zitat:

Zitat von H.Bothur (Beitrag 1451488)
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.

H.Bothur 18. Nov 2019 10:28

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

Rolf Frei 18. Nov 2019 15:00

AW: UTF-8 in Datei schreiben
 
Zitat:

Zitat von H.Bothur (Beitrag 1451483)
Moin,

ich habe da eine Sache die ich nicht verstehe, in dem Beitrag hier ist sehr schön beschrieben wie man einen normalen Text in UTF-8 umwandelt.

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

Bei mir funktioniert dein Code einwandfrei. Die Datei ist UTF-8. Mit was für einem Tool schaust du dir den Fileinhalt an? Ich vermute dein Tool checkt das selber und konvertiert dann UTF-8 in Ansi zur Anzeige. Ich nutze Ultra Edit und der Zeigt mir die erzeugte Datei als UTF-8 Datei an und wandelt auch alle Zeichen entsprechend um. Notepad macht das übrigens auch automatisch. Wenn du die Date damit anschaust, wirst du die UTF-8 Zeichen nicht so sehen wie in deiner MessageBox, sondern bereits umgewandelt in das entsprechende Zeichen.

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.

samso 18. Nov 2019 16:01

AW: UTF-8 in Datei schreiben
 
Zitat:

Zitat von Rolf Frei (Beitrag 1451510)
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.

In D7 ist SetCodePage ja auch nicht vorhanden. Ich denke, hier geht um eine Version aber Delphi 2009 die bereits Unicode-Strings kennt.

Bernhard Geyer 18. Nov 2019 16:06

AW: UTF-8 in Datei schreiben
 
Zitat:

Zitat von Rolf Frei (Beitrag 1451510)
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.

D7 ist auch noch eine Version die nicht richtig viel (was die GUI betrifft) mit Unicode anfangen konnte.
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.

Redeemer 18. Nov 2019 17:28

AW: UTF-8 in Datei schreiben
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1451484)
Diese uralten Funktionen AssignFile, Writeln und Co. können nur Ansi-Strings.

RawByteString ist AnsiString ohne Codepage.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz