Seite 1 von 1

XbZLib liefert falsche Umlaute [Erledigt]

Verfasst: Sa, 02. Mär 2019 23:42
von lesny
Ich versuche das Packen von Dateien mit XbZLib zu realisieren. Prinzipiell funktioniert alles, aber die Umlaute der Dateinamen im ZIP-File sind verhunzt.
Die Datei Grünfläche.jpg heißt im ZIP Gr³nflõche.jpg
Mein Programm setzt anfangst SET CHARSET TO ANSI.
Ich habe auch versucht, vor dem Aufruf des XbZLib-Packvorgangs auf SET CHARSET TO OEM umzustellen, bringt gleiches falsches Ergebnis. Wo kann ich nach dem Fehler suchen, bzw. den richtigen Zeichensatz einstellen?

Re: XbZLib liefert falsche Umlaute

Verfasst: So, 03. Mär 2019 9:30
von AUGE_OHR
moin,
lesny hat geschrieben: Sa, 02. Mär 2019 23:42 Die Datei Grünfläche.jpg heißt im ZIP Gr³nflõche.jpg
das ist ANSI -> OEM ...

woher kommen deine Dateinamen die in das ZIP File sollen :?:
wenn du von Bildern sprichst liegen die vermutlich auf einem Datenträger oder hast du die in einer Datenbank :?:

Code: Alles auswählen

ConvToAnsiCP()
ConvToOEMCP()
sind die beiden Befehle um Zeichensatz umwandeln.

Re: XbZLib liefert falsche Umlaute

Verfasst: So, 03. Mär 2019 11:09
von ramses
Hallo Lesny

das ist kein einfaches Problem.

Ich kenne das auch.

Auf die schnelle gibt es nur eine wirklich funktionierende Lösung: ändere die Filenamen vor dem Packen so dass du keine Umlaute mehr im Namen hast.

Das Problem kommt aus der verwendeten Structure Klassen aus ot4xb genauer dem Member:

Code: Alles auswählen

VARLEN EXTRA MEMBER FileName        SIZE TO FNameLen		// File Name
dieser wird beim ausführen mit

Code: Alles auswählen

#xcommand VARLEN EXTRA MEMBER <cc> SIZE TO <sz> =>  ;
            DYNAMIC  VAR   __<cc> ;
          ; DYNAMIC  PROPERTY <cc> ;
                     READ iif(::__<cc> == NIL,"", ::__<cc>) ;
                     WRITE ( ::<sz> := Len(v) , ::__<cc> := v ) ;
          ; _cgb_ += cPrintf(" + s:%s",<(cc)>) ;
          ; _cpb_ += cPrintf("s:__%s := PeekStr(@v,@nn,s:%s ),", <(cc)> , <(sz)>) ;
          ; _cfr_ += cPrintf("s:__%s := ChrR(0,s:%s),FRead(h,@s:__%s,s:%s),",<(cc)>,<(sz)>,<(cc)>,<(sz)>) ;
          ; _vls_ += cPrintf(" + s:%s ",<(sz)>) ;
umgesetzt.
The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.
Was soviel heisst dass diese Memberklasse kein ANSI beherscht. Was du an deinen verhundsten Filenamen siehst. Du kannst jetzt vor dem schreiben in diese Stuktur den Filenamen von ANSI in OEM umwandeln, so kannst du mit eine geänderten Zeile Code neue Zip Files erstellen. Wenn du aber auch Zipfiles updaten oder entpacken usw. willst werden die änderungen sehr aufwendig.

Vielleicht hätte ja Pablo obies auch ANSI komatibel oder du ändert das Kommando selbst .....


Gruss Carlo

Re: XbZLib liefert falsche Umlaute

Verfasst: Mi, 06. Mär 2019 13:30
von lesny
AUGE_OHR hat geschrieben: So, 03. Mär 2019 9:30 moin,
lesny hat geschrieben: Sa, 02. Mär 2019 23:42 Die Datei Grünfläche.jpg heißt im ZIP Gr³nflõche.jpg
das ist ANSI -> OEM ...

woher kommen deine Dateinamen die in das ZIP File sollen :?:
wenn du von Bildern sprichst liegen die vermutlich auf einem Datenträger oder hast du die in einer Datenbank :?:

Code: Alles auswählen

ConvToAnsiCP()
ConvToOEMCP()
sind die beiden Befehle um Zeichensatz umwandeln.
Die Dateien liegen auf einem Datenträger. Ich übergebe an XbZLib einen Ordner und er soll alles zippen, was in diesem Ordner liegt. Insofern kann ich hier gar nicht direkt eingreifen und Dateinamen umwandeln. Ich werde mit die Antwort von ramses aufgreifen und weiter testen.

Re: XbZLib liefert falsche Umlaute

Verfasst: Mi, 06. Mär 2019 13:33
von lesny
Hallo Carlo,
ramses hat geschrieben: So, 03. Mär 2019 11:09 Was soviel heisst dass diese Memberklasse kein ANSI beherscht. Was du an deinen verhundsten Filenamen siehst. Du kannst jetzt vor dem schreiben in diese Stuktur den Filenamen von ANSI in OEM umwandeln, so kannst du mit eine geänderten Zeile Code neue Zip Files erstellen. Wenn du aber auch Zipfiles updaten oder entpacken usw. willst werden die änderungen sehr aufwendig.

Vielleicht hätte ja Pablo obies auch ANSI komatibel oder du ändert das Kommando selbst .....
Gruss Carlo
Perfekt. Da ich nur Dateien in ein neues ZIP packen will, reicht mir das. Funktioniert wie gewünscht. Habe nur eine Zeile Code geändert, und zwar in

Code: Alles auswählen

Method XbZLibZip:AddData(cFileName, lStream, cFullName, nFSize, cFTime, cFAttr, cComment, lStoreIt, cBuffer)
diese Änderung:

Code: Alles auswählen

oCDRec:FileName            := ConvToOEMCP(cFName) // cFName
Vielen Dank!
Gruß Stefan