Wieder mal UTF8 und TStringlist

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Wieder mal UTF8 und TStringlist

Beitragvon Ronny58 » 14. Mär 2019, 13:23 Wieder mal UTF8 und TStringlist

Hallo Zusammen,

mein Thema ist schon an vielen Stellen behandelt worden und ich hab wohl auf fast alles dazu in verschieden Foren gelesen, komme aber trotzdem nicht weiter.
Deshalb mögen man mir verzeihen, dass ich diese Thema aufmache.

Meine Umgebung:
Windows 10
Lazarus 1.6.4
FPC 3.0.2
VirtualTreeView 5.5.3.1
Excel 2013

Ich habe eine mit Excel 2013 erstellte CSV-Datei mit einer Baumstruktur, die ich im VirtualStringGrid einlese, um die Struktur dort zu bearbeiten.
Anschließend will ich sie wieder in eine CSV-Datei exportieren, um sie mit anderen Programmen zu verwenden.

Im Ersten Schritt öffne ich die CSV-Datei mit einem TStringList und übertrage die Datei in das VirtualStringGrid. Dabei benutze ich ConvertEncoding

sZeile := ConvertEncoding(tsl.Strings[i],GuessEncoding(tsl.Strings[i]), EncodingUTF8);
sVater := parse(';',sZeile,1);
sKind := parse(';',sZeile,2);
sKey := parse(';',sZeile,3);
if sKind <> sVater then
begin { sKind <> sVater }
XNode := FindNode(sVater,fnmElement);
XNode := vstStruktur.Addchild(XNode);
ptdData := vstStruktur.GetNodeData(XNode);
ptdData^.Element:=sKind;
ptdData^.Key:=sKey;
end
else
begin { sKind = sVater }
XNode:=vstStruktur.AddChild(nil);
if vstStruktur.AbsoluteIndex(XNode) > -1 then
Begin
ptdData := vstStruktur.GetNodeData(XNode);
ptdData^.Element:=sKind;
ptdData^.Key:=sKey;
End;
end;

Im VirtualStringGrid wird nun der Inhalt der CSV-Datei inkl. Umlaute perfekt angezeigt.
Nachdem ich die Struktur dort bearbeitet habe Neu, ändern, löschen, umhängen), muss ich die Struktur exportieren daraus wieder eine CSV-Datei erstellen.
Ich laufe also alle Nodes durch und schreibe den Inhalt in eine neues TStringlist, die mit SaveToFile dann speichern.
Bei diesem Prozess bekomme ich die Umlaute nicht mehr hin.

if VstStruktur.GetNodeLevel(pNode) > 0 then vNode := pNode.Parent
else vNode := pNode;
pData := vstStruktur.GetNodeData(pNode);
vData := vstStruktur.GetNodeData(vNode);
s := vData^.Key + ';' +
pData^.Key + ';' +
pData^.Element;
tsl.Add(s);

Zum Schluss ein "tsl.SaveToFile(SaveDialog1.FileName);"

Wenn ich danach die CSV-Datei mit Excel öffne werden die Umlaute nicht richtig angezeigt.
Ich habe es beim Schreiben in die Stringlist auch schon mit tsl.add(UTF8toAnsi(s)) versucht oder mit tsl.add(UTF8toSys(s)). Es klappt nicht mit dem Umlauten.
Und ich verstehe es nicht. Ich brauche die Umlaute.
Was muss ich tun, dass Excel beim Öffnen der so erzeugten CSV-Datei die Umlaute erkennt ?

LG Ronny
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

Beitragvon six1 » 14. Mär 2019, 13:27 Re: Wieder mal UTF8 und TStringlist

probiere mal UTF8toUTF16

obwohl ich glaube nicht, dass das funktioniert.
Dein String ist in ANSI und die Excel Datei hat welche Kodierung?
Öffne die mal mit Notepad++ und schaue dir die Kodierung an...
Gruß, Michael
six1
 
Beiträge: 84
Registriert: 1. Jul 2010, 18:01

Beitragvon theo » 14. Mär 2019, 13:40 Re: Wieder mal UTF8 und TStringlist

Fragt dich Excel (habe keines mehr) beim Import denn nicht, wie es umwandeln soll?
LibreOffice (OpenOffice) zeigt einen Dialog:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
theo
 
Beiträge: 8167
Registriert: 11. Sep 2006, 18:01

Beitragvon Ronny58 » 14. Mär 2019, 13:49 Re: Wieder mal UTF8 und TStringlist

Wenn ich eine Excel-CSV-Datei öffne, steht Notepad++ ist bei Kodierung Ansi markiert.
Also hab ich das mal probiert:
- tsl.Add(UTF8ToUTF16(s)); - ohne Erfolg
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

Beitragvon Ronny58 » 14. Mär 2019, 13:52 Re: Wieder mal UTF8 und TStringlist

nein, eine CSV-Datei wird sofort geöffnet. Aber das Problem ist ja nicht nur mit Excel.
Ich setze IBM-TM1 ein und dort soll letztlich die Struktur geladen werden. Excel-CSV versteht der IBM-Turbointegrator perfekt.
Mit meiner erzeugten Datei mit Umlauten hat er also die gleichen Probleme wie Excel.
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

Beitragvon wp_xyz » 14. Mär 2019, 13:55 Re: Wieder mal UTF8 und TStringlist

Die Datei muss die Endung .txt haben (nicht .csv) damit Excel den Dialog anzeigt, in dem man die Importparameter konfigurieren kann. Aber wenn du eh schon mit Excel arbeitest, warum arbeitest du nicht mit fpspreadsheet, das Excel-Dateien direkt (ohne den Umweg über CSV) lesen und schreiben kann? Da sollten auch die Umlaute kein Problem mehr sein, weil alles automatisch in UTF8 konvertiert wird. - Info hier: http://wiki.lazarus.freepascal.org/FPSpreadsheet
wp_xyz
 
Beiträge: 2907
Registriert: 8. Apr 2011, 08:01

Beitragvon six1 » 14. Mär 2019, 13:56 Re: Wieder mal UTF8 und TStringlist

Ich denke, dass die TStringlist ANSI schreibt.
Probiere mal TSl.add( ANSItoUTF8(s));


Edit: ja, fpspreadsheet wäre auch meine erste Wahl. Ich setzte das oft ein; ohne Probleme.
Gruß, Michael
six1
 
Beiträge: 84
Registriert: 1. Jul 2010, 18:01

Beitragvon Ronny58 » 14. Mär 2019, 14:17 Re: Wieder mal UTF8 und TStringlist

Also ich nutze VirtualTreeView, da ich hier recht komfortabel mit der Kostenartenstruktur und zusätzlichen Attributen arbeiten kann.
Und dann ist Excel ja nicht mein Hauptproblem, sondern der IBM-Turbointegrator.
Da dieser mit CSV gut kann, dachte ich mir: Hast Du das Excel-Problem gelöst, hast du auch das Turbointegrator-Problem gelöst.
Ich hab mal ein Bild angehängt, dass das TI-Problem verdeutlicht.
- AnsiToUTF8
- UTF8ToAnsi
- UTF8ToUTF16
immer mit dem selben Ergebnis, sowohl in Excel also auch im TI.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

Beitragvon Ronny58 » 14. Mär 2019, 14:28 Re: Wieder mal UTF8 und TStringlist

Also ich schau mir das fpsspreadsheet mal an.

Aber wie gesagt ich will keinen Excel-Ersatz, sondern eine komfortable Strukturverwaltung für mich schreiben, die neben der Baustruktur mit einer Vielzahl von Attribute zu dem einzelnen Knoten gut klar kommt.
Baum-Strukturpflege in IBM-TM1 ist zum kotzen. Da muss die Struktur letztlich aber hin. Deswegen importieren ich die meisten Strukturen aus den Vorsystemen. Soweit so gut. Es gibt aber Strukturen, da bieten mir die Vorsysteme nicht was ich brauche. Ich muss ich selbe was bauen. Bevorzugtes Werkzeug dafür war bisher Excel. Bei umfangreichen Strukturänderungen fliegt man aber da dann auch auf die Nase. TM1 reagiert sehr empfindlich auf fehlerhafte Strukturen.
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

Beitragvon six1 » 14. Mär 2019, 15:00 Re: Wieder mal UTF8 und TStringlist

Schau mal hier gibt es noch wissenswertes: http://www.lazarusforum.de/viewtopic.php?t=9436
Gruß, Michael
six1
 
Beiträge: 84
Registriert: 1. Jul 2010, 18:01

Beitragvon wp_xyz » 14. Mär 2019, 15:06 Re: Wieder mal UTF8 und TStringlist

Ronny58 hat geschrieben:- AnsiToUTF8
- UTF8ToAnsi
- UTF8ToUTF16

Die Strings im VirtualTree sind UTF8, du musst sie also von UTF8 nach ANSI konvertieren - also irgendwas wie UTF8To... Im Prinzip wäre UTFToAnsi das richtige, aber fpc 3.0+ versteht auch UTF8-Strings als Ansi-Strings (im Gegensatz zu den 2-Byte-Strings wie WideString oder UnicodeString), daher macht fpc3+ bei dieser Funktion gar nichts mehr (im Gegensatz zu fpc 2.6.4). Richtig wäre m.E. für fpc3+ die Funktion UTF8ToWinCP, die die UTF8-Strings in die Ansi-Strings entsprechend der aktuellen Windows-CodePage umwandelt.

Ronny58 hat geschrieben:- UTF8ToUTF16

Das ist Unsinn, denn du willst ja keine 2-Byte-Strings.
wp_xyz
 
Beiträge: 2907
Registriert: 8. Apr 2011, 08:01

Beitragvon Ronny58 » 14. Mär 2019, 15:54 Re: Wieder mal UTF8 und TStringlist

Und das war's :D

UTF8ToWinCP ist die Lösung.

Tausend Dank an Alle für Eure Unterstützung und ganz besonders an wp_xyz.
Ronny58
 
Beiträge: 38
Registriert: 27. Apr 2014, 19:35

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried