Comment décompresser correctement une archive ZIP de fichiers avec des noms hébreux?

18

Quelqu'un m'a envoyé un fichier ZIP contenant des fichiers avec des noms hébreux (et créé sur Windows, je ne sais pas avec quel outil). J'utilise LXDE sur Debian Stretch. Le gestionnaire d'archives Gnome parvient à décompresser le fichier, mais les caractères hébreux sont tronqués. Je pense que j'obtiens des octets UTF-8 étendus en caractères Unicode, par exemple j'ai un fichier dont le nom a quatre caractères et un suffixe .doc, et les caractères sont: 0x008E 0x0087 0x008E 0x0085. L'utilisation de l'utilitaire de décompression en ligne de commande est encore pire - il refuse de décompresser complètement, se plaignant d'un "caractère multi-octets ou large non valide ou incomplet".

Donc, mes questions sont:

  • Existe-t-il un autre utilitaire de décompression qui décompressera mes fichiers avec les noms corrects?
  • Y a-t-il un problème avec la façon dont le fichier a été compressé, ou s'agit-il simplement d'une incompatibilité des implémentations ZIP? Ou même une anomalie / bogue des utilitaires Linux ZIP?
  • Que puis-je faire pour obtenir les noms de fichiers corrects après avoir décompressé en utilisant les noms tronqués?
einpoklum
la source
Si vous recherchez ces octets dans la table cp862, le nom de fichier correspond-il à ce que vous attendez? Sinon, connaissez-vous l'encodage natif de la machine source?
Michael Homer
Idem pour cp1255 , et tout autre encodage plausible; il peut être possible de le calculer en fonction de ce qui semble correct.
Michael Homer
@MichaelHomer: Non, il ne semble pas correspondre. L'encodage natif de la machine source est tout ce que MS Windows utilise lorsque vous définissez les paramètres régionaux sur Hébreu-Israël, donc je suppose que c'est parfois UTF-8 et parfois CP1255.
einpoklum

Réponses:

15

Il semble que les noms de fichiers soient encodés dans l'une des pages de codes propriétaires de Windows ( CP862 , 1255 , etc.).

  • Existe-t-il un autre utilitaire de décompression qui décompressera mes fichiers avec les noms corrects? Je ne connais pas d'utilitaire zip qui prend en charge ces pages de codes de manière native. 7z a une certaine compréhension des encodages, mais je pense que ce doit être un encodage que votre système connaît plus généralement (vous le choisissez en définissant la LANGvariable d'environnement) et les pages de codes Windows ne font probablement pas partie de ceux-ci.

    unzip -UUdevrait fonctionner à partir de la ligne de commande pour créer des fichiers avec les octets corrects dans leurs noms (en désactivant toute la prise en charge Unicode). C'est probablement l'effet que vous avez déjà obtenu de l'outil GNOME. L'encodage ne sera pas correct de toute façon, mais nous pouvons corriger cela ci-dessous.

  • Y a-t-il un problème avec la façon dont le fichier a été compressé, ou s'agit-il simplement d'une incompatibilité des implémentations ZIP? Ou même une anomalie / bogue des utilitaires Linux ZIP? Le fichier qui vous a été remis n'a pas été créé de manière portable. Ce n'est pas nécessairement faux pour une utilisation interne où l'encodage est fixe et connu à l'avance, bien que la spécification de format indique que les noms sont censés être UTF-8 ou cp437 et que les vôtres ne le sont pas non plus. Même entre les machines Windows, l'utilisation de pages de codes différentes ne fonctionne pas bien, mais les machines non Windows n'ont pas de concept de ces pages de code pour commencer. La plupart des outils UTF-8 codent leurs noms de fichiers (ce qui n'est pas toujours suffisant pour éviter les problèmes).

  • Que puis-je faire pour obtenir les noms de fichiers corrects après avoir décompressé en utilisant les noms tronqués? Si vous pouvez identifier l'encodage des noms de fichiers, vous pouvez convertir les octets des noms existants en UTF-8 et déplacer les fichiers existants vers le bon nom. L' convmvoutil enveloppe essentiellement ce processus en une seule commande: convmv -f cp862 -t utf8 -r .essaiera de tout convertir à l'intérieur .de cp862 en UTF-8.

    Vous pouvez également utiliser iconvet findpour tout déplacer vers leurs noms corrects. Quelque chose comme:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    trouvera tous les fichiers sous le répertoire courant et essaiera de convertir les noms en UTF-8.

    Dans les deux cas, vous pouvez expérimenter différents encodages et essayer de trouver celui qui a du sens.


Après avoir corrigé l'encodage pour vous, si vous souhaitez renvoyer ces fichiers dans l'autre sens, il est possible que vous ayez le même problème à l'autre extrémité. Dans ce cas, vous pouvez inverser le processus avant de compresser les fichiers -UU, car il sera probablement très difficile à corriger du côté de Windows.

Michael Homer
la source
Je suppose que cela devra être fait puisque le fichier ZIP que je cherchais est maintenant parti pour, eh bien, des raisons non pertinentes ici. Merci, je le ferai la prochaine fois et espérons le meilleur.
einpoklum
1
rarou p7ziprefuser de gérer les archives .zip. Existe-t-il un moyen d'extraire une archive avec des noms de fichiers dans des encodages propriétaires, sous Linux? Lorsque j'extrait avec unzip, j'obtiens une erreur: "erreur: impossible de créer ╨и╨╕╨┐ / Ship_╨п ╨Я╤А╨╛╤З╨╗╨ ° ╨Я╤А╨╛ ╨н╤В╨╛ ╨ ▓╨Ю╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Nom de fichier trop long "
Nickolai Leschov
J'ai réussi à extraire le fichier .zip correctement avec LANG=ru_RU.CP1251; unzip Bleed.zip(c'était l'encodage cyrillique dans mon cas). Maintenant, je me demande comment configurer mon système pour pouvoir ouvrir correctement ces fichiers .zip dans l'interface graphique par défaut?
Nickolai Leschov
@NickolaiLeschov Posez une question et quelqu'un pourra peut-être vous aider. Vous devrez probablement fournir plus d'informations sur votre système.
Michael Homer
unzip -UU foo.zipa travaillé pour des personnages turcs
Mert S. Kaplan
8

J'ai eu du succès avec la commande 7z x <source.zip> .

Version:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

Environnement potentiellement pertinent:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

Il a pu décompresser tous les fichiers avec des caractères 8 bits dans leurs noms de fichiers, certains de ces caractères étant sautés, d'autres tronqués.

vszakats
la source
p7zip est le seul qui a fonctionné pour moi
alex88
6

Je viens d'avoir le même problème, et il s'avère que ma version de unzipcelui-ci est disponible dans les référentiels Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) peut gérer le décodage automatique des noms de fichiers si vous spécifiez le -acommutateur.

unzip -a stupid.zip
Igor Zinov'yev
la source
+1 bien que je n'aie rien pour tester cela en ce moment.
einpoklum
1
Selon la page de manuel de unzipl' -ainterrupteur prend en charge la conversion des fichiers texte. Pas de noms de fichiers.
beruic
@beruic, j'avais décompressé des numéros Unicode comme noms de fichiers (# U + 0040 # U + 0050 ...), puis "décompresser -a" m'a vraiment aidé.
chang zhao
1
J'ai essayé ça sur des mangas. Les noms de fichiers ont été décodés correctement, mais les images ont également été interprétées comme du texte (!) Et complètement corrompues. Il interprète même les fichiers zip et rar à l'intérieur de l'archive comme du texte, la détection est complètement inutile.
rjh
2

J'ai eu un problème similaire avec le décodage d'une archive zip avec des caractères cyrilliques. Un script python d'une ligne a fait le travail correctement:

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

Ensuite, appelez-le unzip_encet appelez-leunzip_enc ZIP_FILE [TARGET_DIR]

Pour moi unzip -UU, unzip -ani LANG*les variables ni les variables d'environnement n'ont fait de bien.

Iskren Ivov Chernev
la source
J'essaierai la prochaine fois que j'ai un tel fichier zip à extraire ... merci. Mais - pourriez-vous changer votre script de manière à: 1. vérifier s'il y a deux arguments 2. extraire vers le répertoire de travail actuel si seul le fichier zip est fourni?
einpoklum
2

J'ai eu de la chance avec cette combinaison:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

ajoutez --notest à convmv pour le renommer réel. Plus tard, j'ai trouvé une version encore meilleure:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest
asdjfiasd
la source
+1 juste pour convmv et l'outil 7zip en ligne de commande.
einpoklum
Il faut probablement essayer différentes options de LANGvariable et d' encodage en fonction du fichier à portée de main. J'ai un dossier où LANG=ru_RU.CP1251ensemble avec -f cp866travaillé.
Dmitri Chubarov
0

J'ai une archive zip compressée sous Linux (à partir de la ligne de commande) et les noms de fichiers avec des caractères diacritiques ne sont pas correctement décompressés sous Windows, mais je les ai décompressés avec succès avec le logiciel Bandizip qui peut définir charset sur la barre d'outils.

Miro Junker
la source