Wieder mal UTF8 und TStringlist

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Wieder mal UTF8 und TStringlist

Beitrag von six1 »

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

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

Re: Wieder mal UTF8 und TStringlist

Beitrag von theo »

Fragt dich Excel (habe keines mehr) beim Import denn nicht, wie es umwandeln soll?
LibreOffice (OpenOffice) zeigt einen Dialog:
Dateianhänge
oocsv.png

Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Re: Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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: 90
Registriert: So 27. Apr 2014, 20:35

Re: Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Wieder mal UTF8 und TStringlist

Beitrag von wp_xyz »

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

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Wieder mal UTF8 und TStringlist

Beitrag von six1 »

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

Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Re: Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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.
Dateianhänge
ti.jpg

Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Re: Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Wieder mal UTF8 und TStringlist

Beitrag von six1 »

Schau mal hier gibt es noch wissenswertes: http://www.lazarusforum.de/viewtopic.php?t=9436
Gruß, Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Wieder mal UTF8 und TStringlist

Beitrag von wp_xyz »

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.

Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Re: Wieder mal UTF8 und TStringlist

Beitrag von Ronny58 »

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.

Antworten