Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Müsste das Symbol □ Mit Delphi 2007 in eine Datei schreiben


Bruzzler - Mi 07.10.09 10:40
Titel: Müsste das Symbol □ Mit Delphi 2007 in eine Datei schreiben
Hilfe Leute, ich habe schon vergeblich nach einer Lösung gesucht. Ich müsste dieses Komische Symbol an das Ende einer TextDatei schreiben.



Ich habe hierdurch : http://www.fileformat.info/info/unicode/char/25a1/index.htm herausgefunden, dass dieses Symbol wohl Unicode ist. Gibt es eine Möglichkeit dieses Symbol einfach und ohne Geld Aufwand in eine Textdatei zu schreiben. Soviel ich weis ist ja Delphi 2007 nicht Unicode fähig.


Vielen Dank schon im Voraus.


Gausi - Mi 07.10.09 10:56

Hallo und :welcome: in der Entwickler-Ecke,

Wenn das eine Textdatei ist, dann muss die ganze Textdatei in einem "anderen Format" abgespeichert werden. Das hat nichts mit Delphi zu tun, sondern ist generell so. Eine Textdatei ist ja nichts anderes als eine Folge von Bytes, die dann als "Buchstaben" interpretiert werden. In den meisten Textdateien gilt "1 Byte = 1 Buchstabe". Das wird hier nicht funktionieren.

Du müsstest die ganze Datei im UTF-16 oder UTF-8 Format abspeichern. Mit den gängigen Methoden (myStringlist.WriteToFile) klappt das erst mit Delphi 2009. Ich habe hier grade nur D2009, daher kann ich das nicht genau testen, aber generell sollte das so funktionieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Pseudocode
aWideString := Inhalt_der_Textdatei + #9633;
aUTF8_String := Utf8Encode(aWideString);

FileStream erzeugen;
UTF8-Byte-Order-Markierung (EF BB BF) in den Stream schreiben;
aUTF8_String in den Stream schreiben;
FileStream schließen;

Das Lesen der Datei muss man dann natürlich auch wieder anders gestalten.


Bruzzler - Mi 07.10.09 12:43

Erstmal Danke, aber das war mir ein bißchen zu schnell sorry.

Funktioniert das ganz nun mit Delphi 2007? Oder nur mit 2009?

Dieser PseudoCode den du gepostet hast, gilt der für 2007 oder 2009?
Den konnte ich nicht ganz nachvollziehen.


elundril - Mi 07.10.09 12:53

Der Pseudocode gilt Afaik sogar für Delphi 7, da es da schon Filestreams gibt. Und vielleicht geht der Sourcecode sogar schon in Delphi 7. Einfach mal in die Hilfedatei gucken, da kommt man dann schon gewaltig weiter ;)

lg elundril


Gausi - Mi 07.10.09 13:03

Ja, das geht auch mit Delphi 7. Habe ich auch so ähnlich in meinem Player benutzt, um m3u8-Playlisten (UTF-8-kodiert) zu unterstützen.

Idee dahinter ist folgende.

Zuerst packt man die Textdatei in einen WideString. Dieser ist intern UTF-16 kodiert, kommt also mit "Unicode-Zeichen" klar (gibts auch schon bei Delphi 7). Dann wandelt man diesen Widestring mit dem zusätzlichen Zeichen in einen UTF-8-kodierten String um. Muss man nicht tun, ist aber sehr sinnvoll - sonst wird die Textdatei direkt doppelt so groß.
Anschließend speichert man diesen UTF-8-String in eine Textdatei. Damit ein Texteditor die "richtig" lesen kann, sollte man am Anfang der Datei "sagen", dass hier UTF-8 verwendet wird. Dafür sind diese drei Bytes EF BB BF da. Lässt man die weg, hat man wahrscheinlich anstelle der Sonderzeichen (deines, aber auch die deutschen Umlaute) zwei (oder mehr) andere Zeichen, die irgendwie komisch aussehen.

Bei Delphi 2009 geht das automatisch, da kann man den SaveToFile-Methoden die Kodierung mitgeben. Bei früheren Versionen muss man da etwas basteln.


Bruzzler - Mi 07.10.09 14:19

Ok, habe ich soweit verstanden, nur das mit der Byte-Order-Markierung nicht ganz. Schreibe ich da einfach an die Erste Stelle der Datei die Bytes? Das ist nicht gut, dann dann wird mein anderes Programm diese Datei wohl nicht mehr schlucken.


Bruzzler - Do 08.10.09 11:36

Ok vergesst es. Habs geschafft danke an alle!