TStringlist encoding "übernehmen" [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TStringlist encoding "übernehmen" [gelöst]

Beitrag von corpsman »

Servus, ich bastle gerade nen c präprocessor der macht im prinzip folgendes:

.c oder .h Datei Laden in String Speichern
String wie wild bearbeiten
String als .c oder .h Datei Speichern

Laut meinem Textanalysetool ist das "String wie wild bearbeiten" richtig. Aber die Encodierung geht verloren (genauer gesagt das UTF8-BOM)

Vereinfacht sieht mein Code so aus:

Code: Alles auswählen

Var
  source, dest: TStringlist;
  e: Tencoding;
  s: String;
Begin
  source := TStringlist.create;
  source.loadfromfile('irgendwas');
  e := source.encoding.clone;
  s := source.text;
  source.free;
  // to the magic on s
  dest := Tstringlist.create;
  dest.text := s;
  dest.SaveToFile('irgendwie', e);
  dest.free;
End; 
Gibt es da noch einen Trick, mache ich was falsch, oder muss man einfach das BOM von Hand in S einfügen.. ?
Zuletzt geändert von corpsman am Do 1. Apr 2021, 07:10, insgesamt 2-mal geändert.
--
Just try it

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TStringlist encoding "übernehmen"

Beitrag von PascalDragon »

Unter der Annahme, dass du FPC 3.2.0 oder neuer verwendest: TStrings.WriteBom.
FPC Compiler Entwickler

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TStringlist encoding "übernehmen"

Beitrag von theo »

Falls du eine etwas allgemeinere Lösung suchst, kann dir vielleicht auch mein alter TCharEncStream helfen. https://wiki.freepascal.org/UTF8_Tools
Damit wird versucht, so zu speichern wie gelesen wurde, wenn das Objekt beibehalten wird zwischen lesen und schreiben.
Also:
ANSI, UTF8, UTF16, UTF32
big-endian, little-endian
with/without BOM
Für deinen Fall heißt das: Wenn in der Originaldatei eine BOM da war, wird auch wieder eine BOM geschrieben, sonst nicht.

Die Benutzung ist recht intuitiv:

Code: Alles auswählen

 f := TCharEncStream.Create;
 f.LoadFromFile('test.txt');
 S := f.UTF8Text;
 //Tu was mit S (UTF8)
 f.UTF8Text:=S;
 f.SaveToFile('test.txt');
 f.Free;  

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TStringlist encoding "übernehmen"

Beitrag von corpsman »

Danke, das probiere ich morgen gleich mal aus ;)
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TStringlist encoding "übernehmen"

Beitrag von corpsman »

@theo,

danke hat 1a funktioniert, dank online Package manager wars auch super einfach integriert *g*
--
Just try it

Antworten