descomprimir ZIP com a codificação fornecida

13

Eu tenho o (s) arquivo (s) ZIP, que contém arquivos, cujos nomes de arquivos estão em alguma codificação. Digamos que eu saiba codificar esses nomes de arquivos, mas ainda não sei como descompactá-los corretamente.

Aqui está um exemplo do arquivo , ele contém um arquivo "【SSK 字幕 组】 The Vampire Diaries 吸血鬼 日记 S06E12.ass"

Eu sei que a codificação usada é GB18030 (chinês)

A questão é - como descompactar esse arquivo no FreeBSD usando o unzip ou outro utilitário CLI para obter o nome de arquivo codificado correto? Eu tentei tudo o que pude, mas o resultado nunca foi bom. Por favor ajude.

Eu tentei no 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!

Eu tentei semelhante com descompactar, mas recebo um problema parecido.

Obrigado, agora tentando no FREE BSD, onde eu estou conectando usando o SSH do 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

A primeira coisa, eu gostaria de mostrar os nomes chineses. Eu mudei

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Então baixei arquivo e tente" ls "para ver os caracteres apropriados, mas não a sorte. Então eu acho que tenho que resolver o primeiro local chinês para verificar quando obtenho resultado adequado, na verdade, posso compará-lo. Você também pode me ajudar por favor com isso?

    
por 2ge 02.02.2015 / 11:46

7 respostas

14

Aqui está o que eu faço no Ubuntu 16.04 para descompactar um zip em qualquer codificação, desde que eu saiba o que é essa codificação. O mesmo método deve funcionar no FreeBSD porque ele depende apenas da ferramenta unzip amplamente disponível.

  1. Eu verifiquei o nome exato da codificação para não cometer erros de ortografia: link

  2. Eu simplesmente corro

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

    ou

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

    escolhendo entre -O ou -I de acordo com as instruções aqui:

    $ 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
      ...
    

    o que significa que eu simplesmente tento -O e isso deve funcionar, porque muitas pessoas não criariam um arquivo .zip no Unix ...

Então, para o seu exemplo específico:

  1. O nome exato da codificação é GB18030 .

  2. Eu uso o sinalizador -O e:

    $ 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
    

    ... funciona.

por 02.06.2017 / 08:50
8

Na maioria dos sistemas de arquivos POSIX, o nome do arquivo é apenas uma série de bytes e cabe ao usuário fazer algum sentido. Você pode usar isso para sua vantagem.

  1. Primeiro, extraia o arquivo usando bsdtar , já que a ferramenta unzip parece manipular os nomes dos arquivos, enquanto o bsdtar os extrairá cru. (Estou testando isso no Linux. Eu acho que o FreeBSD apenas chama isso de tar .)

    $ bsdtar xf gb18030.zip
    
  2. Verifique se ferramentas como iconv podem decodificar os nomes com êxito:

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

    (Observe que isso afeta apenas a saída find , não os arquivos em si.)

  3. Finalmente, use convmv para converter os nomes dos arquivos para UTF-8:

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

    (Nota: Eu tive que instalar o Encode :: HanExtra do CPAN para o suporte GB18030, e adicionar manualmente o use Encode::HanExtra; ao / usr / bin / convmv mesmo que seja suposto

  4. No caso de convmv não estar disponível, faça o script:

    $ 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
    

    (Pelo menos no Linux, isso tem uma vantagem em que iconv está quase sempre disponível, e sempre suporta gb18030.)

por 02.02.2015 / 12:57
2

O 7z suporta o ID do conjunto de caracteres com um comutador -scs , por exemplo:

7z x -scs903 some.zip

em que 903 é 簡體 簡體 charset. Uma lista mais longa de IDs de conjuntos de caracteres pode ser encontrada aqui .

    
por 02.12.2016 / 03:41
2

Método 1 : use o utilitário unar

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Método 2 : use um script python para descompactar o arquivo (referência link )

#!/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()

O exemplo gb18030.zip extrairá o seguinte arquivo

【SSK 字幕 组】 The Vampire Diaries 日记 日记 S06E12 【SSK 字幕 组】 The Vampire Diaries 日记 日记 S06E12 / 【SSK 字幕 组】 The Vampire Diaries 吸血鬼 日记 S06E12.ass

    
por 23.04.2017 / 07:42
2

No OS X, você pode usar um aplicativo GUI chamado The Unarchiver . Pode ser instalado usando o Mac App Store ou Cask Homebrew :

brew cask install the-unarchiver

Quando você abre um arquivo ZIP com ele, o aplicativo permite que você escolha a codificação apropriada usando a visualização de um nome de arquivo do arquivo.

    
por 01.06.2018 / 08:29
0

eu apenas usei o 7zip e ele conseguiu escolher a codificação certa.

(algo que o zip padrão não pode fazer)

mas usado no Windows, com a ferramenta GUI. Talvez a linha de comando 7z funcione para você também.

    
por 23.01.2016 / 10:42
0

Use 7z para extrair o arquivo

7z x yourfile.zip

Depois disso, converta a codificação desses nomes de arquivo:

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

Isso funciona para mim .. from_encoding no meu caso é tis-620 (que é uma codificação tailandesa), você precisa encontrar uma codificação adequada do seu idioma. Um popular geralmente resolve o problema, mas se o nome do arquivo ainda estiver ilegível, tente mudar from_encoding para outras coisas, como windows-1252 ou shift-jis (japonês) ou qualquer outra coisa, você pode listar a codificação disponível usando o comando:

convmv --list
iconv --list

Este é um método muito simples de "como resolver" para mim.

    
por 13.06.2016 / 17:12

Tags