AGB  ·  Datenschutz  ·  Impressum  







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

Textdatei utf8-kodiert speichern!

Ein Thema von SirRobert · begonnen am 6. Sep 2006 · letzter Beitrag vom 11. Apr 2012
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.810 Beiträge
 
Delphi 12 Athens
 
#1

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 10:53
Klar geht es, das hab ich ja gesehen, nur bei Umlauten wirds halt kriminell. Und da kann ich nicht wirklich aufpassen, bzw. das einzige wäre Umlaute umzuwandeln in ihr zweibuchstabiges Pendant. Oder was meinst Du?

Mit dem Stream stosse ich übrigens auf andere Geschichten. Ich gebe zu, ich habe bisher Texte nur als TextFiles gespeichert und TFileStream nie verwendet.

Mein Versuch:
Delphi-Quellcode:
var ExportText : UTF8String;
    myfStream : TFileStream;
.
.
.
      fExpFileName := fDateiPfad + GUIDohneKlammern + '.xml';
      myfStream := TFileStream.Create(fExpFileName, fmCreate);

      ExportText := #239 + #187 + #191 + ExportText; // Ist das ausreichend als BOM?

      myfStream.Write(ExportText,Length(ExportText));
Führt zu einer unleserlichen Datei. Muss ich mit dem BOM noch was anderes anstellen? Ist das die Falsche Art den BOM einzufügen?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#2

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 11:10
Delphi-Quellcode:
// besser als explizite Unicodeangabe, also 4-stellig, damit keine Codepage in die Quere kommen kann
ExportText := #$00EF#$00BB#$00BF + ExportText;

// oder gleich das korrekte Zeichen (das #$FEFF ist der Unicodemarker ... all diese Text-BOMs sind dieses Zeichen, nur eben entsprechend kodiert)
ExportText := UTF8Encode(#$FEFF) + ExportText;

z.B. #$0085 ist nicht #$85 ... das hatte mich mal veräppeln wollen
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 11:33
Delphi-Quellcode:
var ExportText : UTF8String;
    myfStream : TFileStream;
.
.
.
      fExpFileName := fDateiPfad + GUIDohneKlammern + '.xml';
      myfStream := TFileStream.Create(fExpFileName, fmCreate);

      ExportText := #239 + #187 + #191 + ExportText; // Ist das ausreichend als BOM?

      myfStream.Write(ExportText,Length(ExportText));
Führt zu einer unleserlichen Datei. Muss ich mit dem BOM noch was anderes anstellen? Ist das die Falsche Art den BOM einzufügen?

Sherlock
Wenn es eine XMl Datei ist, kommt es auf das in der Datei enthaltene Encoding-Attribut an. Wenn es nicht angegeben wird, ist es standardmäßig UTF-8. Dann kann auch das BOM komplett entfallen. (Wenn es angegeben wird, muss es mit dem tatsächlichen Encoding übereinstimmen).
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.810 Beiträge
 
Delphi 12 Athens
 
#4

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 12:19
mjustin: Das ist absolut korrekt. Nur leider scheint Delphi oder meine Unfähigkeit an der Geschichte etwas zu verwürfeln. Ich tippe übrigens auf letzteres
Ich habe mir jetzt mal die entstandene Datei im Hex-Editor näher angesehen. Es scheint ein Manifest zu sein. Also wird irgendwie die Resource abgespeichert...nicht mein XML-String!

Mach ich was grundsätzlich falsch mit dem Stream?
Der auf Seite 1 geposteter Code ist alles, was ich mit dem StreamObjekt treibe.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.810 Beiträge
 
Delphi 12 Athens
 
#5

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 13:53
...und das ist des Rätsels Lösung: Der Sherlock ist dooof.

Hier wie man es richtig macht:
Das eigentliche Schreiben:
Delphi-Quellcode:
var DerBOM : UTF8String;
    ExportText : UTF8String;
.
.
.
      DerBOM := #$00EF#$00BB#$00BF;
      f.WriteBuffer(PAnsiChar(DerBOM)^, Length(DerBOM)); // Könnte man sicher auch in einem Rutsch machen
      f.WriteBuffer(PAnsiChar(exporttext)^, Length(ExportText)); // Aber so gehts definitiv...Unterschied? ZEIGER
Bei der Erzeugung des ExportStrings sollte man im Übrigen immer wieder mal ein UTF8Encode einstreuen...vor allem da, wo Non-ANSI-Zeichen erwartet werden.

Quelle zur letztlichen Lösung (die D2009 voraussetzt, das ich nicht habe): http://mzemaitis.wordpress.com/tag/s...xtfile-delphi/

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Bbommel

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

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 13:57
Hi Sherlock,

noch mal zu den TextFiles. Ich bin da mittlerweile auch ein bisschen von weg, aber habe unter D2007 auch einige Jahre problemlos mit TextFiles/writeln und UTF8 gearbeitet.

Codebeispiel:

Delphi-Quellcode:
procedure Demo;
var s:string;
    fileH: TextFile;
begin
  s:='Ein ü ist ein ü!';
  assignFile(fileH,'egal.txt');
  rewrite(fileH);
  writeln(fileH,utf8encode(s));
  closeFile(fileH);
end;
Damit das reibungslos funktioniert und Delphi nicht intern irgendwas umwandelt, was ich gar nicht will, war es gut, den Text selbst ganz normal als "string" zu benutzen und erst am Ende beim writeln mit "utf8encode" umzuwandeln.

Alternativ geht das gleiche auch mit TStringList, also:
Delphi-Quellcode:
[...}
StrList.Add(utf8encode(s));
StrList.SaveToFile('egal.txt');
[...]
Und wenn du auf Delphi >=2009 umsteigst, musst du den Code eh wieder anfassen.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.810 Beiträge
 
Delphi 12 Athens
 
#7

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 14:06
Grrmml...hättest Du das nicht vor 4 Stunden schreiben können?

Egal, jetzt stehen hier für zukünftige Generationen zwei Lösungen



Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.221 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Textdatei utf8-kodiert speichern!

  Alt 10. Apr 2012, 14:30
Grrmml...hättest Du das nicht vor 4 Stunden schreiben können?

Egal, jetzt stehen hier für zukünftige Generationen zwei Lösungen



Sherlock
Wie Bbommel schon geschrieben hast ist das keine Lösung "für zukünfitge Generationen".

In "zukunft" (D2009+) reicht ein

StrList.SaveToFile('egal.txt', TEncoding.UTF8);
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Bbommel

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

AW: Textdatei utf8-kodiert speichern!

  Alt 11. Apr 2012, 07:56
Wie Bbommel schon geschrieben hast ist das keine Lösung "für zukünfitge Generationen".
Das stimmt natürlich für die StringList. Aber auch wenn readln/writeln hier immer eher einen schlechten Ruf genießen , sei noch erwähnt, dass man das obige Beispiel mit writeln auch unter XE2 noch genau so benutzen kann. Nur wenn man dann UTF8-Dateien mit readln lesen wollen würde, müsste man basteln (das Stichwort RawByteString fiel ja schon).

Und wenn das zukünftige Suchende finden, sollte aber auch noch erwähnt werden, dass beide Beispiele von mir keinen BOM schreiben. Der müsste, falls benötigt, dann noch manuell davor ergänzt werden.

Bis denn
Bommel
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:03 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-2025 by Thomas Breitkreuz