Zipper und Umlaute in Dateinamen

Rund um die LCL und andere Komponenten
Antworten
LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Zipper und Umlaute in Dateinamen

Beitrag von LazProgger »

Um ein ZIP-Archiv zu erstellen, benutze ich die TZipper-Komponente, die bei Lazarus dabei ist:

Code: Alles auswählen

 
uses zipper;
 
AZipper := TZipper.Create;
AZipper.Filename := 'abc.zip';
AZipper.Entries.AddFileEntry(AFileName);
AZipper.ZipAllFiles;
AZipper.Free;
 
Das funktioniert alles wunderbar, allerdings klappt das Hinzufügen von Dateien nur dann, wenn sie keine Umlaute oder andere Unicode-Zeichen enthalten.

Nach einer Internetrecherche bin ich auf folgenden Workaround gekommen, um die UTF8-Kodierung von Lazarus in die des Systems umzuwandeln:

Code: Alles auswählen

 
AZipper.Entries.AddFileEntry(UTF8ToSys(AFileName));
 
Das verhindert immerhin die Fehlermeldung und fügt die Datei zu der ZIP-Datei hinzu.
Aber innerhalb der ZIP-Datei werden die Umlaute damit immer noch falsch angezeigt. Zum Beispiel "õ" statt "ä".

Was kann man tun, um auch innerhalb der ZIP-Datei die Dateinamen richtig zu behalten?

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

Re: Zipper und Umlaute in Dateinamen

Beitrag von theo »

LazProgger hat geschrieben: Das verhindert immerhin die Fehlermeldung und fügt die Datei zu der ZIP-Datei hinzu.
Aber innerhalb der ZIP-Datei werden die Umlaute damit immer noch falsch angezeigt. Zum Beispiel "õ" statt "ä".
Was heisst "innerhalb der ZIP-Datei"?
Mit welchem Werkzeug schaust du in die Datei?

AddFileEntry hat auch noch einen zweiten Parameter, mit dem man angeben kann, wie die Datei im Zip heissen soll.

Function AddFileEntry(Const ADiskFileName, AArchiveFileName : String): TZipFileEntry;

Mathias
Beiträge: 7319
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zipper und Umlaute in Dateinamen

Beitrag von Mathias »

Mit diesem Test-Code klappt es.
Anscheinend verwendet ZIP den normalen ASCII-Code.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  AZipper: TZipper;
begin
  AZipper := TZipper.Create;
  AZipper.Filename := UTF8toSys('ööü.zip');
  AZipper.Entries.AddFileEntry(UTF8toSys('äöü.txt'), UTF8toConsole('äöü.txt'));
  AZipper.ZipAllFiles;
  AZipper.Free;
end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: Zipper und Umlaute in Dateinamen

Beitrag von LazProgger »

Vielen Dank Mathias, da wäre ich nie selber drauf gekommen. So funktioniert es.

Schon verrückt, dass man einmal UTF8toSys und einmal UTF8toConsole benutzen musst. Aus reiner Interesse: Weißt du vielleicht wieso?

Dann wäre noch die Frage, wie und ob es dann überhaupt möglich ist Zeichen außerhalb des ASCII-Bereichs zu verwenden. Das wäre ja mit den beiden Konvertierungen nicht möglich...

@theo: Mit innerhalb der ZIP-Datei meine ich die Dateinamen wie sie erscheinen, wenn man die ZIP-Datei öffnet. Ob mit 7Zip oder dem Windows-Entpacker, beides zeigt dasselbe Ergebnis.

Mathias
Beiträge: 7319
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zipper und Umlaute in Dateinamen

Beitrag von Mathias »

Aus reiner Interesse: Weißt du vielleicht wieso?
Lazarus bearbeitet Strings als UTF8.
UTF8toSys wandelt den Lazarus-String in den Betriebsystemgängigen String um.
UTF8toConsole wandelt den Lazarus-String in eine 8bit- ASCII-String um.
Wie der Name schon sagt, wird dieser auch bei der Console gebraucht. Teste es mal mit Writeln('äöü'); .

So wie es aussieht, speichert die ZIP-Datei die Datei-Namen als normalen ASCII-String.
Die Ursache könnte aus der MS-DOS-Zeit sein, ZIP ist ja uralt.

Bitte korrigieren falls ich einen Mist geschrieben habe. ;)
Dann wäre noch die Frage, wie und ob es dann überhaupt möglich ist Zeichen außerhalb des ASCII-Bereichs zu verwenden.
Da müsst du wohl einen Test machen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 7319
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zipper und Umlaute in Dateinamen

Beitrag von Mathias »

Dann wäre noch die Frage, wie und ob es dann überhaupt möglich ist Zeichen außerhalb des ASCII-Bereichs zu verwenden. Das wäre ja mit den beiden Konvertierungen nicht möglich...
Ich habe anstellen von 'äöü.txt' folgedes eingesetzt ''使用下列语言.txt''.
Die Anwendung spielt dann verrückt mit folgender Konsolen-Ausgabe.

Code: Alles auswählen

TApplication.HandleException Unable to open file "??????.txt"
  Stack trace:
  $0042D705
  $0042D539
  $005549EF of ./win32/win32wsspin.pp
  $005550F5 of ./win32/win32wsspin.pp
  $00555476 of ./win32/win32wsspin.pp
  $005553A0 of ./win32/win32wsspin.pp
  $00555328 of ./win32/win32wsspin.pp
  $00508DEE  TCONTROL__CLICK,  line 2724 of ./include/control.inc
  $005201EF  TBUTTONCONTROL__CLICK,  line 54 of ./include/buttoncontrol.inc
  $005208F1  TCUSTOMBUTTON__CLICK,  line 169 of ./include/buttons.inc
  $0052010A  TBUTTONCONTROL__WMDEFAULTCLICKED,  line 20 of ./include/buttoncontr
ol.inc
  $0040AEA6
  $004FCE30  TWINCONTROL__WNDPROC,  line 5322 of ./include/wincontrol.inc
  $0054C4E5  DELIVERMESSAGE,  line 112 of lclmessageglue.pas
  $004D5B70  WINDOWPROC,  line 2512 of ./win32/win32callback.inc
  $00551D85  CUSTOMFORMWNDPROC,  line 395 of ./win32/win32wsforms.pp
  $755362FA
 
Später kommt dann noch "Unable to open file "??????.txt"" und bricht ab.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Zipper und Umlaute in Dateinamen

Beitrag von theo »

Das geht so nicht. Probier mal mit ExtractShortPathNameUTF8

http://wiki.freepascal.org/LCL_Unicode_ ... Dateinamen

Socke
Lazarusforum e. V.
Beiträge: 3188
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Zipper und Umlaute in Dateinamen

Beitrag von Socke »

Schau mal hier: http://stackoverflow.com/questions/1063 ... ip-in-java
Demnach kann das Dateiformat prinzipiell UTF-8, dieses ist in der Unit zipper aber nicht implementiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Zipper und Umlaute in Dateinamen

Beitrag von Komoluna »

Also, ich habe ein Rätsel mit Zipp, warum ist mein Zipp nur Feile entfelten, aber nicht komprimieren?
Hammer Satzbau
(Klingt so nach Google Übersetzer... File = Feile?)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: Zipper und Umlaute in Dateinamen

Beitrag von LazProgger »

Socke hat geschrieben:Schau mal hier: http://stackoverflow.com/questions/1063 ... ip-in-java
Demnach kann das Dateiformat prinzipiell UTF-8, dieses ist in der Unit zipper aber nicht implementiert.
Wäre es denn schwierig das selbst zu implementieren und die zipper Unit zu ergänzen?

Antworten