Wieder mal UTF8 und TStringlist
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,GuessEncoding(tsl.Strings), 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
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,GuessEncoding(tsl.Strings), 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
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...
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
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:
LibreOffice (OpenOffice) zeigt einen Dialog:
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
Also hab ich das mal probiert:
- tsl.Add(UTF8ToUTF16(s)); - ohne Erfolg
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.
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.
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
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.
Probiere mal TSl.add( ANSItoUTF8(s));
Edit: ja, fpspreadsheet wäre auch meine erste Wahl. Ich setzte das oft ein; ohne Probleme.
Gruß, Michael
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.
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.
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.
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.
Re: Wieder mal UTF8 und TStringlist
Schau mal hier gibt es noch wissenswertes: http://www.lazarusforum.de/viewtopic.php?t=9436
Gruß, Michael
Re: Wieder mal UTF8 und TStringlist
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: - AnsiToUTF8
- UTF8ToAnsi
- UTF8ToUTF16
Das ist Unsinn, denn du willst ja keine 2-Byte-Strings.Ronny58 hat geschrieben: - UTF8ToUTF16
Re: Wieder mal UTF8 und TStringlist
Und das war's
UTF8ToWinCP ist die Lösung.
Tausend Dank an Alle für Eure Unterstützung und ganz besonders an wp_xyz.

UTF8ToWinCP ist die Lösung.
Tausend Dank an Alle für Eure Unterstützung und ganz besonders an wp_xyz.