AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

UTF-8 in Datei schreiben

Ein Thema von H.Bothur · begonnen am 18. Nov 2019 · letzter Beitrag vom 20. Nov 2019
Antwort Antwort
Seite 1 von 2  1 2      
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#1

UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 09:25
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;
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 09:49
Diese uralten Funktionen AssignFile, Writeln und Co. können nur Ansi-Strings.

Du musst hier z.B. mit Streams arbeiten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 10:22
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Alt 18. Nov 2019, 10:42     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 10:52
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
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Alt 18. Nov 2019, 11:04     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Bbommel

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

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 11: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
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 11:28
@Bbommel: Vielen Dank - Dann mache ich es erst einmal Quick & Dirty und kuck mir das andere in Ruhe an

Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Alt 18. Nov 2019, 11:51     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 16:00
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.

Geändert von Rolf Frei (18. Nov 2019 um 16:07 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#8

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 17:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 17:06
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.081 Beiträge
 
Delphi 2009 Professional
 
#10

AW: UTF-8 in Datei schreiben

  Alt 18. Nov 2019, 18:28
Diese uralten Funktionen AssignFile, Writeln und Co. können nur Ansi-Strings.
RawByteString ist AnsiString ohne Codepage.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
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