web-dev-qa-db-fra.com

décompresser avec un codage donné

J'ai un fichier Zip, qui contient des fichiers, dont les noms de fichiers sont encodés. Disons que je connais le codage de ces noms de fichiers, mais je ne sais toujours pas comment les décompresser correctement.

Voici un exemple fichier , il contient un fichier "【SSK 组 Les journaux de vampire 吸血鬼 S06E12.ass"

Je sais que l'encodage utilisé est GB18030 (chinois)

La question est de savoir comment décompresser ce fichier dans FreeBSD en utilisant unzip ou un autre utilitaire de la CLI pour obtenir le nom de fichier correctement encodé. J'ai tout essayé, mais les résultats n'ont jamais été bons. S'il vous plaît aider.

J'ai essayé sur OSX:

MBP1:test 2ge$ bsdtar xf gb18030.Zip
MBP1:test 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12/      gb18030.Zip
MBP1:test 2ge$ cd %A1%BESSK%D7%D6Ļ%D7顿The\ Vampire\ Diaries\ %CE%FCѪ%B9%ED%C8ռ%C7S06E12/
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass*
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ find . | iconv -f gb18030 -t utf-8
.
./%A1%BESSK%D7%D6L抬%D7椤縏he Vampire Diaries %CE%FC血%B9%ED%C8占%C7S06E12.ass 
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ convmv -r -f gb18030 -t utf-8 --notest .
Skipping, already UTF-8: ./%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass
Ready!

J'ai essayé similaire avec unzip, mais j'ai le même problème.

Merci, essayez maintenant FREE BSD, où je me connecte avec SSH depuis OSX (Terminal):

# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=C

La première chose que j'aimerais faire est de bien montrer les noms chinois. j'ai changé

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Ensuite, j'ai téléchargé le fichier et essayer de "ls" pour afficher les caractères appropriés, mais pas de chance. Je pense donc que je dois d'abord résoudre les paramètres régionaux chinois pour vérifier quand j'obtiens un résultat correct. En fait, je peux le comparer. Pouvez-vous aussi m'aider s'il vous plaît avec cela?

20
2ge

Voici ce que je fais sur Ubuntu 16.04 pour décompresser un Zip dans n’importe quel encodage, tant que je sais ce qu’il en est. La même méthode devrait fonctionner sous FreeBSD car elle ne repose que sur l’outil unzip, largement disponible.

  1. Je revérifie le nom exact de l'encodage, pour ne pas le mal orthographier: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Je cours simplement

    $ unzip -O <encoding> <filename> -d <target_dir>
    

    ou

    $ unzip -I <encoding> <filename> -d <target_dir>
    

    choisir entre -O ou -I en suivant les instructions données ici:

    $ unzip -h
    UnZip 6.00 of 20 April 2009, by Debian. Original by Info-Zip.
      ...
      -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
      -I CHARSET  specify a character encoding for UNIX and other archives
      ...
    

    ce qui signifie que j'essaie simplement -O et que cela devrait fonctionner, car peu de gens créeraient un fichier .Zip sous Unix ...


Donc, pour votre exemple spécifique:

  1. Le nom de codage exact est GB18030.

  2. J'utilise le drapeau -O et:

    $ unzip -O GB18030 gb18030.Zip -d target_dir
    Archive:  gb18030.Zip
       creating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/
      inflating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass
    

    ... Ça marche.

17
mbdevpl

Sur la plupart des systèmes de fichiers POSIX, le nom de fichier est juste une série d'octets et il appartient à l'utilisateur de le comprendre. Vous pouvez utiliser ça à votre avantage.

  1. Tout d’abord, extrayez l’archive à l’aide de bsdtar, car l’outil unzip semble modifier les noms de fichiers, alors que bsdtar les extraira bruts. (Je teste cela sous Linux. Je suppose que FreeBSD l'appelle simplement tar.)

    $ bsdtar xf gb18030.Zip
    
  2. Vérifiez que des outils tels que iconv peuvent décoder les noms avec succès:

    $ find . | iconv -f gb18030 -t utf-8
    

    (Notez que cela n'affecte que la sortie find, pas les fichiers eux-mêmes.)

  3. Enfin, utilisez convmv pour convertir les noms de fichier en UTF-8:

    $ convmv -r -f gb18030 -t utf-8 --notest .
    

    (Remarque: je devais installer Encode :: HanExtra de CPAN pour le support GB18030, et ajouter manuellement use Encode::HanExtra; à/usr/bin/convmv même si Supposé

  4. Si convmv n'est pas disponible, écrivez le script suivant:

    $ find . -depth | while read -r old; do
        old=./$old;
        head=${old%/*};
        tail=${old##*/};
        new=$head/$(echo "$tail" | iconv -f gb18030 -t utf-8);
        [ "$old" = "$new" ] || mv "$old" "$new";
    done
    

    (Au moins sous Linux, ceci présente un avantage en ce que iconv est presque toujours disponible, et il toujours supporte gb18030.)

10
grawity

Méthode 1: utiliser un utilitaire

Sudo apt-get install unar

unar -e gb18030 gb18030.Zip

Méthode 2: utilisez un script python pour décompresser le fichier (référence https://Gist.github.com/ usunyu/dfc6e56af6e6caab8018bef4c3f3d452 # fichier-gbk-unzip-py )

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# unzip-gbk.py

import os
import sys
import zipfile
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--encoding", help="encoding for filename, default gbk")
parser.add_argument("-l", help="list filenames in zipfile, do not unzip", action="store_true")
parser.add_argument("file", help="process file.Zip")
args = parser.parse_args()
print "Processing File " + args.file

file=zipfile.ZipFile(args.file,"r");
if args.encoding:
    print "Encoding " + args.encoding
for name in file.namelist():
    if args.encoding:
        utf8name=name.decode(args.encoding)
    else:
        utf8name=name.decode('gbk')
    pathname = os.path.dirname(utf8name)
    if args.l:
        print "Filename " + utf8name
    else:
        print "Extracting " + utf8name
        if not os.path.exists(pathname) and pathname!= "":
            os.makedirs(pathname)
        data = file.read(name)
        if not os.path.exists(utf8name):
            fo = open(utf8name, "w")
            fo.write(data)
            fo.close
file.close()

L’exemple gb18030.Zip extraira le fichier suivant

Les journaux de vampires Les journaux de vampires Les journaux de vampire Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires Les journaux de vampires

6
javacom

7z prend en charge l’ID de jeu de caractères avec un commutateur -scs, par exemple:

7z x -scs903 some.Zip

où 903 est 中文 簡體 charset. Une liste plus longue d'ID de jeux de caractères peut être trouvée ici .

4
ohho

Sous OS X, vous pouvez utiliser une application graphique appelée The Unarchiver . Il peut être installé à l'aide de Mac App Store ou Homebrew Cask :

brew cask install the-unarchiver

Lorsque vous ouvrez un fichier Zip avec celui-ci, l'application vous permet de choisir le codage approprié à l'aide de la prévisualisation d'un nom de fichier à partir de l'archive.

4
Melebius

Utilisez 7z pour extraire le fichier

7z x yourfile.Zip

Ensuite, convertissez vous-même l’encodage de ces noms de fichiers:

convmv --notest -f from_encoding -t utf-8 -r your_extracted_folder/

Cela fonctionne pour moi. From_encoding Dans mon cas, c'est tis-620 (qui est un encodage en thaï), vous devez trouver un encodage approprié de votre langue. Un problème populaire résout généralement le problème, mais si le nom du fichier est toujours illisible, essayez de remplacer from_encoding par un autre outil tel que windows-1252 ou shift-jis (japonais) ou tout autre choix, vous pouvez répertorier le codage disponible à l'aide de la commande suivante:

convmv --list
iconv --list

Ceci est très simple "comment résoudre" méthode pour moi.

1
off99555

je viens d'utiliser 7Zip et il a réussi à choisir le bon encodage.

(Quelque chose que Zip standard ne pouvait pas faire)

mais utilisé sous Windows, avec l’outil graphique. Peut-être que la ligne de commande 7z fonctionnera aussi pour vous.

0
Berry Tsakala