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?
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.
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
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:
Le nom de codage exact est GB18030
.
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.
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.
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
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.)
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é
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.)
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
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 .
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.
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.
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.